Redis数据结构(二)

压缩列表

1:压缩列表是为了节省内存而设计的,是一种线性的数据结构。主要用在哈希和列表两种数据类型中。

2:压缩列表包含主要包含五个部分,这五个部分顺序排列组合在一起。
结构如下图所示。
这里写图片描述
表节点,有三个域组成。previous_entry_length,用来记录前一个节点的长度。encoding,记录下一个域的数据类型和长度。content,保存节点的值。
这里写图片描述

3:压缩列表有一种极端情况,会导致性能下降——连锁更新。previous_entry_length,记录的是上一节点的长度,当上一节点小于254字节时,该属性使用1字节存储。当大于254字节时,使用5字节。如果之前previous_entry_length都使用1字节,且长度都接近254字节时,会导致连锁更新的情况。

具体使用情况

1:不同数据类型对应的编码对象
这里写图片描述

2:字符串对应的编码方式。1:整数值实现的字符串对象。2:embstr实现的字符串(类似SDS,用于保存端的字符串)。3:raw,SDS动态字符串
这里写图片描述
转换规则:
这里写图片描述

3:列表对象,编码包含两种,ziplist(压缩列表),linkedlist(双向链表)。
这里写图片描述
转换规则:
1:保存的所有字符串长度都小于64字节。
2:列表对象保存的元素数量小于512个。
当同时满足上面两条规则时,使用列表对象,否则使用链表对象。

4:哈希对象,使用ziplist和hashtable编码
ziplist:
这里写图片描述
hashtable:
这里写图片描述
转换规则:
1:哈希对象保存的所有键和值的字符串长度都小于64字节。
2:保存的键值对数量小于512个。
同时满足,使用ziplist,否则使用hashtable.

5:集合对象,使用intset或者hashtable编码。
intset:
这里写图片描述
hashtable:
这里写图片描述
转换规则:
1:集合对象保存的元素值都是整数。
2:集合对象保存的元素数量不超过512个。
同时满足上面两个条件,则使用intset,否则hashtable。

6:有序集合,使用ziplist或者skiplist
这里写图片描述
转换规则:
1:有序集合保存的元素数量小于128个。
2:保存的所有成员长度都小于64字节。
同时满足上面两个条件,则使用ziplist,否则skiplist。

基于数据结构的东西就写这么多吧,当然内容都是《redis设计与实现-黄健宏》上的。我只是个搬运工,这本书写的挺不错的,建议购买。更详细的实现细节,可以看redis源码。

坚持原创技术分享,您的支持将鼓励我继续创作!