压缩列表是列表键和哈希键底层实现之一。
一、压缩列表结构
例:
entry结构:
previous_entry_length:该属性以字节为单位,可以是1字节或者5字节,记录了压缩列表中前一个节点的长度。
1字节:前一节点的长度小于254字节。
5字节:前一节点长度大于等于254字节;其中第一字节会被设置为0xFE(十进制254),之后的四个字节用于保存前一节点的长度。
encoding:记录了节点content属性所保存数据的类型以及长度。
1字节、2字节、5字节:最高位为00、01、10的是字节数组编码,表示content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录。
1字节:最高位是11的是整数编码,表示content保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录。
content:保存节点的值,值是一个字节数组或者整数,值得类型和长度由节点的encoding属性决定。
二、
连锁更新(触发概率低)
新增或删除节点时,previous_entry_length从1字节扩展到5字节,而引起一系列的节点重新分配空间。
触发条件:
1)压缩列表中有多个连续的、长度介于250字节至253字节之间的节点
2)新增或者删除节点
如图:
重点回顾:
1、压缩列表是一种为节约内存而开发的顺序型数据结构。
2、压缩列表被用作列表键和哈希键的底层实现之一。
3、压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值。
4、添加或删除压缩列表中节点时,可能会引发连锁更新操作,但这种操作出现的几率并不高(触发条件不好满足)。