redis之七压缩列表

1 简介

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。当一个哈希键只包含少量键值对,并且每个键值对的键和值要么是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。

2 压缩列表(ziplist)的构成

压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序性数据结构,一个压缩列表可以包含任意多个节点,每个节点都可以保存一个字节数组或者一个整数值。

1)       zlbytes,记录整个压缩列表占用的内存字节数,在对压缩列表进行内存重分配,或者计算zlend的位置时使用。

2)       zltail,记录压缩列表 表尾节点距离压缩列表起始地址有多少字节,通过这个偏移量,程序无需遍历整个压缩列表就可以确定表尾节点的地址。

3)       zllen,记录了压缩列表包含的节点数量,当这个属性的值小于65535时,这个属性的值就是压缩列表包含节点的数量,当这个值等于65535时,节点的真实数量需要遍历整个压缩列表才能计算出来。

4)       entryX,压缩列表包含的各个节点,节点的长度由节点保存的内容决定。

5)       zlend,特殊值0xFF,用于标记压缩列表的末端

3 压缩列表节点的构成

1)       previous_entry_length,以字节为单位,记录了压缩列表总前一个节点的长度。previous_entry_length属性的长度可以是1字节或者5字节。具体长计算方式:

1,       如果前一个节点的长度小于254字节,那么previous_entry_length属性的长度为1字节,前一结点的长度就保存在这一个字节中。

2,       如果前一节点的长度大于等于254字节,那么previous_entry_length属性的长度为5字节,其中属性的第一字节会被设置为0xFE,而之后的四字节则用于保存前一节点的长度。

压缩列表从表尾到表头的遍历操作就是使用这个原理实现的。

2)       encoding属性记录了节点的content属性所保存数据的类型以及长度:

1,       一字节、两字节或者五字节长,值的最高位为00、01、10的是字节数组的编码,这种比编码标识节点的content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录。

2,       一字节长,值最高为以11开头的是整数编码,这种编码标识节点的content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录。

3)       Content保存着节点的值,节点值可以是一个数组或者一个整数,值的类型和长度由节点的encoding属性决定。

4 连锁更新

当需要在压缩列表中添加新的节点或者删除节点的时候有可能会引起连锁更新

你可能感兴趣的:(redis之七压缩列表)