当前位置:   article > 正文

Redis设计与实现(七)—— 压缩列表_redis压缩列表 优点

redis压缩列表 优点

压缩列表是 Redis 为了节约内存而开发的, 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry), 每个节点可以保存一个字节数组或者一个整数值。如图所示

在这里插入图片描述

压缩列表构成
  • zlbytes:长度是4字节,用于记录整个压缩链表占用的内存字节数,在对压缩列表进行内存重分配, 或者计算 zlend 的位置时使用。
  • zltail:长度是4字节,记录压缩列表表尾节点距离压缩列表的起始地址有多少字节,根据这个偏移量,程序可以不用遍历就能确定表尾节点的地址
  • zllen:记录了压缩列表包含的节点数量: 当这个属性的值小于 UINT16_MAX (65535)时, 这个属性的值就是压缩列表包含节点的数量; 当这个值等于 UINT16_MAX 时, 节点的真实数量需要遍历整个压缩列表才能计算得出。
  • extryX:压缩列表包含的各个节点,节点的长度由节点保存的内容决定。
  • zlend:用于标记压缩列表的末端
    在这里插入图片描述
压缩列表节点构成

每个压缩列表节点都由 previous_entry_length 、 encoding 、 content 三个部分组成
在这里插入图片描述
previous_entry_length 属性以字节为单位, 记录了压缩列表中前一个节点的长度。

  • 如果前一节点的长度小于 254 字节, 那么 previous_entry_length 属性的长度为 1 字节: 前一节点的长度就保存在这一个字节里面。
  • 如果前一节点的长度大于等于 254 字节, 那么 previous_entry_length 属性的长度为 5 字节: 其中属性的第一字节会被设置为 0xFE (十进制值 254), 而之后的四个字节则用于保存前一节点的长度。
    压缩列表的从表尾向表头遍历操作就是使用这一原理实现的: 只要我们拥有了一个指向某个节点起始地址的指针, 那么通过这个指针以及这个节点的 previous_entry_length 属性, 程序就可以一直向前一个节点回溯, 最终到达压缩列表的表头节点。

encoding 属性记录了节点的 content 属性所保存数据的类型以及长度:

content 属性负责保存节点的值, 节点值可以是一个字节数组或者整数, 值的类型和长度由节点的 encoding 属性决定。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/538581
推荐阅读
相关标签
  

闽ICP备14008679号