My Personal Time

Desire is the starting point of all achievement

0%

Redis设计与实现笔记六

压缩列表

压缩列表是列表键和哈希键的底层实现之一。

使用压缩列表作为列表键底层实现:列表键只包含少量列表项,并且每个列表项要么是小整数值要么是长度比较短的字符串

使用压缩列表作为哈希键底层实现:哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串

压缩列表构成

ziplist是Redis为了节约内存而开发的,各部分如下

31284971924

节点构成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
* 保存 ziplist 节点信息的结构
*/
typedef struct zlentry {

// prevrawlen :前置节点的长度
// prevrawlensize :编码 prevrawlen 所需的字节大小
unsigned int prevrawlensize, prevrawlen;

// len :当前节点值的长度
// lensize :编码 len 所需的字节大小
unsigned int lensize, len;

// 当前节点 header 的大小
// 等于 prevrawlensize + lensize
unsigned int headersize;

// 当前节点值所使用的编码类型
unsigned char encoding;

// 指向当前节点的指针
unsigned char *p;

} zlentry;

每个压缩列表节点可以保存一个字节数组或者一个整数值,

添加新节点或者删除节点,可能会引发连锁更新操作,导致需要对压缩列表执行N次空间重分配操作,最坏复杂度O(N^2)。