Redis经典五大类型源码及底层实现
经典面试题
Redis的跳跃列表了解吗?这个数据结构有什么特点
redis项目里面怎么用?redis的数据结构都了解那些?
redis的zset底层实现,说了压缩列表和跳表,问这样设计的优缺点,只说了优点,缺点没说出来
redis的跳表说一下,解决了哪些问题,时间复杂度和空间复杂度如何
其实阅读源码90%是没有太大意义的,完全是为了面试,但是10%是因为大厂自己的内部中间件,比如贵公司自己内部redis重构,阿里云redis,美团tair,滴滴kedrs等等
redis源码
https://github.com/redis/redis
而对应的源码分析的书籍有
核心部分
数据结构
- 简单动态字符串sds.c
- 整数集合intset.c
- 压缩列表ziplist.c
- 快速链表quicklist.c
- listpack
- 字典dict.c
Redis数据库的实现
数据库底层实现db.c 和 持久化rdb.c 、aof.c
Redis服务端和客户端实现
- 事件驱动ae.c 和 ae_epoll.c
- 网络连接anet.c 和 networking.c
- 服务端程序 server.c
- 客户端程序redis-cli.c
Redis字典数据库KV键值对是什么?
redis是key-value存储系统,key一般是String类型的字符串对象,value类型则为redis对象(redisObject),value可以是字符串对象,也可以是集合数据类型的对象,比如List对象,Hash对象,set对象和zset对象。
10大类型
String
List
Hash
Set
Zset
bitmap 实质是String
hyperloglog 实质是String
GEO 实质是Zset
Stream 实质是Stream
BITFIELD 看具体key
上帝视角
RedisObject结构体
redis定义了redisobject结构体来表示string、hash、list、set、zset等数据结构
struct结构体
Redis中每个对象都是一个redisobject
字典、KV是什么?
每个键值对都会有一个dictEntry
这些键值对是如何保存进Redis并进行读取操作,O(1)复杂度的
redisObject + Redis数据类型 + Redis所有编码方式(底层实现)三者之间的关系
五大数据结构C语言源码分析
redis6.0.5
redis6之前,老版本
Redis7
源码分析总体数据结构大纲
程序员写代码时脑子底层思维
从set hello world说起
set hello word为例,因为Redis是KV键值对的数据库,每个键值对都会有一个dictEntry(源码位置:dict.h),里面指向了key和value的指针,next 指向下一个 dictEntry。
key 是字符串,但是 Redis 没有直接使用 C 的字符数组,而是存储在redis自定义的 SDS中。
value 既不是直接作为字符串存储,也不是直接存储在 SDS 中,而是存储在redisObject 中。
实际上五种常用的数据类型的任何一种,都是通过 redisObject 来存储的。
看看类型 type hello String 看看编码 Object encoding hello embstr
redisObject结构的作用
为了便于操作,Redis采用redisObjec结构来统一五种不同的数据类型,这样所有的数据类型就都可以以相同的形式在函数间传递而不用使用特定的类型结构。同时,为了识别不同的数据类型,redisObjec中定义了type和encoding字段对不同的数据类型加以区别。简单地说,redisObjec就是string、hash、list、set、zset的父类,可以在函数间传递时隐藏具体的类型信息,所以作者抽象了redisObjec结构来到达同样的目的。
RedisObject各个字段的含义
1 4位的type表示具体的数据类型
2 4位的encoding表示该类型的物理编码方式见下表,同一种数据类型可能有不同的编码方式。
(比如String就提供了3种:int embstr raw)
3 lru字段表示当内存超限时采用LRU算法清除内存中的对象。
4 refcount表示对象的引用计数。
5 ptr指针指向真正的底层数据结构的指针。
例如
set age 17
type | 类型 |
encoding | 编码,此处是数字类型 |
lru | 最近被访问的时间 |
refcount | 等于1,表示当前对象被引用的次数 |
ptr | value值是多少,当前就是17 |
Redis系列-13.Redis经典五大类型源码及底层实现(一)(中):https://developer.aliyun.com/article/1414744