压缩列表
压缩列表是列表键和哈希键的底层实现之一。
使用压缩列表作为列表键底层实现:列表键只包含少量列表项,并且每个列表项要么是小整数值要么是长度比较短的字符串
使用压缩列表作为哈希键底层实现:哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串
压缩列表构成
ziplist是Redis为了节约内存而开发的,各部分如下
节点构成
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)。