redis源码学习紧凑列表 listpack,t_hash的御用底层结构

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis源码学习紧凑列表 listpack,t_hash的御用底层结构相关的知识,希望对你有一定的参考价值。

listpack

Stream 定制的数据结构有两个:listpack 和 rax。这篇我们先讲一下 listpack。

listpack 是对 ziplist 的优化。从5中率先在streams中引入listpack,直到6后作为t_hash御用底层数据结构,redis应该是发现极致的内存使用远远不如提高redis的处理性能。

ziplist 的级联更新

这个级联更新出现的概率极低,所以在ziplist的那篇我就没写。但是它一旦出现的话就是一场灾难,而 listpack 则是为了解决这一问题而生,所以在这一篇我补上这一个知识点。

级联更新是现有压缩列表构造的一个弊端。

这个弊端源于previous_entry_length属性的设定,这个属性可能占1字节,也可能占5字节,实际占用空间大小和前一个节点大小有关。如果在某个位置新插入一个较大的节点,或者删除一个大节点后的节点,可能就会导致后面节点的previous_entry_length属性由1字节变成5字节,而因为该属性的改变也会导致该entry大小的改变,从而可能引发该entry大于等于254字节,进而导致后面的entry大小继续改变。这个改变可能会波及到整个压缩列表,所以称之为级联更新。

级联更新在最坏情况下需要对压缩列表执行N次空间重分配操作,每次重分配的复杂度是ON,级联更新最坏复杂度为ON方。

虽然级联更新存在,但是出现概率很低,几乎可以忽略不计。


设计图 PK

整体上看,listpack少了一些。其实相比较ziplist,listpack中的优化在于entry中。

entry 的内容分布为:<encode><val><backlen>
encode:节点编码格式
val:节点元素
backlen:反向遍历时使用的节点长度

以上是关于redis源码学习紧凑列表 listpack,t_hash的御用底层结构的主要内容,如果未能解决你的问题,请参考以下文章

3.30--Redis之常用数据结构--listpack(总结篇)------加油呀

redis源码学习快速列表 quicklist

redis源码学习快速列表 quicklist

吃透Redis:数据结构篇-skiplistquicklistlistpack

吃透Redis:数据结构篇-skiplistquicklistlistpack

吃透Redis:数据结构篇-skiplistquicklistlistpack