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

2021-12-27 13:17:25 浏览数 (1)

文章目录

    • listpack
      • ziplist 的级联更新
      • 设计图 PK

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:反向遍历时使用的节点长度

0 人点赞