[redis] 数据结构 -- 紧凑列表

Redis 5.0引入了listpack作为对ziplist的改进,以解决级联更新可能导致的性能问题。listpack在存储效率上优于ziplist,但因兼容性问题尚未全面替代ziplist。目前,Stream数据结构已采用listpack。
摘要由CSDN通过智能技术生成

listpack 紧凑列表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值