压缩列表是列表和字典的底层实现
压缩列表结构
压缩列表字段说明
属性 | 类型 | 用途 |
---|---|---|
zlbytes | uint32_t | 整个压缩列表所占字节数 |
zltail | uint32_t | 记录最后节点距离压缩列表起始位置的字节数 |
zllen | uint16_t | 压缩列表中的元素个数 |
entryX | 不定 | 存储的元素 |
zlend | uint8_t | 特殊值(0xFF) |
压缩列表节点结构
previous_engtry_length : 存储上一个元素的长度,有两个长度
1个字节,如果上一个entry的长度小于254字节,previous_entry_length 为一个字节
5个字节,如果上一个entry的长度大于等于254字节,previous_entry_length为5个字节,第一个字节为0XFE,后四个字节存储上一个entry的长度
encoding : 数据的编码格式
编码 | 编码长度 | content保存的值 |
---|---|---|
00****** | 1个字节 | 长度小于等于63个字节的字节数组 |
01****** | 2个字节 | 长度小于2^14-1个字节的字节数组 |
10****** | 5个字节 | 长度小于2^36-1个字节长度字节数组 |
11000000 | 一个字节 | 一个int16_t整数 |
11010000 | 一个字节 | 一个int32_t整数 |
11100000 | 一个字节 | 一个int64_t整数 |
11110000 | 一个字节 | 24位有符号整数 |
1111**** | 一个字节 | 使用这一编码的节点没有content属性,数据直接存储在encoding中 |
总结
- 压缩列表中存储总长度,尾节点位置以及存储的节点个数
- 通过记录的尾节点位置可以快速定位尾节点位置,然后通过previous_entry_length可以反向遍历压缩列表
- 在entry中通过encoding编码来定义数据宽度,节省内存
需要注意的是如果连续几个节点的长度位250~254之间,如果新增一个节点长度大于254在这几个节点之前,因为之前的节点存不下这个长度,会导致连锁更新