listpack 紧凑列表
- 说明: 因为ziplist 在极小的概率下有可能发生级联更新,当连续规模较大的级联更新发生时,对 Redis 的性能有比较大的影响。所以 在 5.0 版本中, 新增 listpack 它是对 ziplist 结构的改进,在存储空间上会更加节省,而且结构上也比 ziplist 要精简。
- 结构
struct listpack<T> { int32 total_bytes; // 占用的总字节数 int16 size; // 元素个数 T[] entries; // 紧凑排列的元素列表 int8 end; // 同 zlend 一样,恒为 0xFF } 相比于 ziplist 的定义,它有两点改动: 1. 记录的长度不再是前一个节点的长度,而是自己的长度。 2. 将记录自己的长度放到了节点的尾部。 这样做的好处是: 1. 不再需要 zltail_offset 属性也可以快速定位到最后一个节点。用listpac 的总长度-最后一个节点的长度. 2. 每个节点记录自己的长度,当本节点的值发生了改变,只需要更改自己的长度即可。不再需要更改别的节点的属性,也就彻底的解决掉了级联更新问题。 - listpack 的设计的目的是用来取代 ziplist,不过当下还没有做好替换 ziplist 的准备,因为有很多兼容性的问题需要考虑,ziplist 在 Redis 数据结构中使用太广泛了,替换起来复杂度会非常之高。
- 在 5.0 版本引入的 Stream 数据结构中,就使用了 listpack 而不是 ziplist.
Redis 5.0引入了listpack作为对ziplist的改进,以解决级联更新可能导致的性能问题。listpack在存储效率上优于ziplist,但因兼容性问题尚未全面替代ziplist。目前,Stream数据结构已采用listpack。
328

被折叠的 条评论
为什么被折叠?



