压缩列表

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

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

压缩列表的构成

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

Screenshot_20220105_213114.png

压缩列表的各个组成部分

Screenshot_20220105_213142.png

压缩列表节点的构成

每个压缩列表节点都由previous_entry_length、encoding、content三个部分组成

Screenshot_20220105_213409.png

previous_entry_length

节点的previous_entry_length属性以字节位单位,记录了压缩列表中前一个节点的长度。previous_entry_length属性的长度可以是字节或者5字节。

  • 如果前一个节点的长度小于254字节,那么previous_entry_length属性的长度位1字节:前一个节点的长度就保存在这一个字节里面。
  • 如果前一个节点的而长度大于等于254节点,那么previous_entry_length属性的长度为5字节:其中属性的第一字节会被设置位0xFE(十进制254),而之后的4个字节则用于保存前一个节点的长度

encoding

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

  • 1字节、2字节或者5字节,值的最高位为00、01或者11的是字节数组编码:这种编码表示节点的encoding属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录
  • 一字节长,值的最高位以11开头的是整数编码:这种编码表示节点的content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录

content

节点的content属性负责保存节点的值,节点的值可以是一个字节数组或整数,值的类型和长度由节点的encoding属性决定

连锁更新