压缩列表的定义:

压缩列表是为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。

压缩列表的构成:

【Redis笔记】压缩列表(ziplist)_数据结构

压缩列表节点的构成:

【Redis笔记】压缩列表(ziplist)_删除节点_02

 

 previous_entry_length:记录压缩列表前一个节点的长度

【Redis笔记】压缩列表(ziplist)_删除节点_03

 根据previous_entry_length,程序可以通过指针运算,根据当前节点的起始地址来计算出前一个节点的起始地址,从而实现从表尾到表头遍历。

encoding:

记录节点的content属性保存的数据的类型和长度

【Redis笔记】压缩列表(ziplist)_数据结构_04

【Redis笔记】压缩列表(ziplist)_数据结构_05


 content:

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

连锁更新:

添加或删除节点,如果长度大于254字节,可能导致后一个节点的previous_entry_length大小需要从1字节变为5字节,这样可能会导致后续节点的previous_entry_length都发生变化,在这种情况下,需要进行连续多次空间拓展操作。

说明:

(1)空间分配最坏时间复杂度O(N),连锁更新的最坏时间复杂度O(N方)

(2)情况不多见并且只要节点个数不多,不会对性能造成影响。