压缩列表
压缩列表是列表键和哈希键的底层实现之一(列表键list的另一个底层实现是链表,哈希键hash另一个实现底层是哈希表)
当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么redis会使用压缩列表来做列表键的底层实现。
另外当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,也会采用压缩列表来做哈希键的底层实现。
压缩列表的构成
压缩列表是Redis为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表是可以包含任意多个节点的,每个节点可以保存一个字节数组或者一个整数值
它的结构如下图所示
-
zlbytes:类型为uint32_t(无符号型32位整数,长度为4字节,以16进制表示),用来记录整个压缩列表占用的内存字节数,在对压缩列表进行内存重分配时,或者计算zlend的位置时使用
-
zltail:类型为unit32_t(无符号型32位整数,长度为4字节,以16进指表示),记录压缩列表的尾结点(entryN)距离压缩列表的起始位置(zlBytes)有多少字节,其实就是一