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

图1-连锁更新流程.png
二、连锁更新,代码实现流程
- 记录起始节点信息
- 获取 Current 节点的长度和所需字节数
- 获取 Next 节点的信息
- 完全不用更新的情况,当Current的节点长度等于Next前置节点长度值
- Next前置节点长度值更新情况
-
Next 的前置节点内存空间 需要扩容 (Current的节点长度所需空间 大于 Next 的前置节点内存空间)
- 计算 Nextdiff,Current的节点长度所需空间 与 Next 的前置节点内存空间的差值
- 压缩列表容量增加 Nextdiff 大小
- 如果 Next 节点之后还有节点,说明其不是尾节点,将 Nextdiff 加入到尾节点偏移量中
- 移动原数据,Next节点的原前置节点内存处开始移动
- 将 Current 节点长度写入 Next 节点的前置节点内存空间
- 将 Current 指向 Next 节点,处理下一个节点
-
Next 的前置节点内存空间 无需扩容
- Current的节点长度所需空间 小于 Next 的前置节点内存空间
- 将 Current的节点长度写入Next 的前置节点内存空间
- Current的节点长度所需空间 小于 Next 的前置节点内存空间
- 将 Current的节点长度写入Next 的前置节点内存空间
- Current的节点长度所需空间 小于 Next 的前置节点内存空间
-