图解Redis压缩列表-连锁更新

一、为什么会连锁更新
新增或删除节点时,可能触发连锁更新。以删除为例,删除节点的前置节点称为cur,后置节点称为next。cur节点长度超过254,next的“前置节点长度”空间不足以存储254时,需要对next的“前置节点长度”进行扩容,如果next节点扩容后的长度刚好超过254,就会导致next的后置节点也需要对其“前置节点长度”空间扩容,导致连环更新“前置节点长度”空间

图1-连锁更新流程.png

二、连锁更新,代码实现流程

  1. 记录起始节点信息
  2. 获取 Current 节点的长度和所需字节数
  3. 获取 Next 节点的信息
  4. 完全不用更新的情况,当Current的节点长度等于Next前置节点长度值
  5. Next前置节点长度值更新情况
    1. Next 的前置节点内存空间 需要扩容 (Current的节点长度所需空间 大于 Next 的前置节点内存空间)

      1. 计算 Nextdiff,Current的节点长度所需空间 与 Next 的前置节点内存空间的差值
      2. 压缩列表容量增加 Nextdiff 大小
      3. 如果 Next 节点之后还有节点,说明其不是尾节点,将 Nextdiff 加入到尾节点偏移量中
      4. 移动原数据,Next节点的原前置节点内存处开始移动
      5. 将 Current 节点长度写入 Next 节点的前置节点内存空间
      6. 将 Current 指向 Next 节点,处理下一个节点
    2. Next 的前置节点内存空间 无需扩容

      1. Current的节点长度所需空间 小于 Next 的前置节点内存空间
        • 将 Current的节点长度写入Next 的前置节点内存空间
      2. Current的节点长度所需空间 小于 Next 的前置节点内存空间
        • 将 Current的节点长度写入Next 的前置节点内存空间
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容