压缩列表
压缩列表是列表键和哈希键的底层实现之一。
使用压缩列表作为列表键底层实现:列表键只包含少量列表项,并且每个列表项要么是小整数值要么是长度比较短的字符串
使用压缩列表作为哈希键底层实现:哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串
压缩列表构成
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)。