压缩列表
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源码。