Redis有五种基本数据结构:字符串、hash、set、zset、list。但是你知道构成这五种结构的底层数据结构是怎样的吗?
0x01:Redis底层八种数据结构
简单动态字符串 SDS (simple synamic string):支持自动动态扩容的字节数组
链表 list :链表
字典 dict :使用双哈希表实现的, 支持平滑扩容的字典
跳跃表 zskiplist :附加了后向指针的跳跃表
整数集合 intset :用于存储整数数值集合的自有结构
压缩列表 ziplist :一种实现上类似于TLV, 但比TLV复杂的, 用于存储任意数据的有序序列的数据结构
quicklist:一种以ziplist作为结点的双链表结构, 实现的非常不错
zipmap :一种用于在小规模场合使用的轻量级字典结构
0x02:Redis五种存储类型与底层八数据结构的映射关系
Redis五种存储类型与八种数据结构的桥梁, 是redisObject;Redis中的Key与Value在表层都是一个redisObject实例, 所以该结构有所谓的"类型", 即是ValueType.。对于每一种Value Type类型的redisObject;其底层至少支持两种不同的底层数据结构来实现。
来自《Redis设计与实现第二版》
字符串
字符串类型对应Redis底层三种数据结构,分表是int、raw和embstr。
(a)当Value是数字的时候,对应int
(b)当字符串长度比较短(长度不大于39字节)时,对应embstr
(c)当字符串长度比较长(长度大于39字节)时,对应raw
其中embstr和raw都是由SDS动态字符串构成的。唯一区别是:raw是分配内存的时候,redisobject和 sds 各分配一块内存,而embstr是redisobject和raw在一块儿内存中。
列表
(a)列表对象所有字符串元素长度都小于64字节或者元素数量小于512时,对应ziplist
(b)不满足ziplist条件的其他情况,对应list 双向量表
hash
(a)元素数量小于512或者所有元素长度小于64字节时,对应ziplist 缩列表
(b)不满足ziplist条件的其他情况,对应dic 字典(也就是哈希表)
set
(a)所有元素都是整数或者元素数量小于512时,对应整数集合 inset
(b)不满足inset条件的其他情况,对应dic 字典(也就是哈希表)
zset
(a)元素数量小于128或者所有元素长度小于64字节,对应ziplist 压缩列表
(b)不满足ziplist条件的其他情况,对应跳跃表 zskiplist
最后介绍一个命令来显示五种数据类型的底层数据结构
OBJECT ENCODING key
上面的命令给string 数据类型 k1赋值str,给 k2赋值123,通过 OBJECT ENCODING 命令,显示底层实现的数据类型分别是 embstr 和 int。