Redis中的压缩列表

Redis中的压缩列表


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


压缩列表的构成

未命名文件.png-2.8kB

  • zlbytes: uint32_t;4字节;记录整个压缩列表占用的内存字节数:在对压缩列表进行内存重分配,或者计算zlend的位置时使用
  • zltail: uint32_t;4字节;记录压缩列表表尾节点距离压缩列表的起始地址有多少字节:通过这个偏移量,程序无须遍历整个压缩列表就可以确定表尾节点的地址
  • zllen:uint16_t;2字节;记录了压缩列表包含的节点数量,当值为65535时,存储的值不准确,此时的值需要通过遍历得到
  • entryX:列表节点;不定;压缩列表包含的各个节点,节点的长度由节点保存的内容决定
  • zlend:uint8_t;1字节;特殊值0xFF(十进制255),用于标记压缩列表的末端


压缩列表节点的构成

  • 长度小于等于63字节的字节数组
  • 长度小于等于16383字节的字节数组
  • 长度小于等于4294967295字节的字节数组
  • 4位长的无符号整数
  • 1字节长的有符号整数
  • 3字节长的有符号整数
  • int16_t类型整数
  • int32_t类型整数
  • int64_t类型整数

previous_entry_length

未命名文件.png-2.7kB

  • 保存前一个节点的长度
  • 如果前一个节点的长度小于254个字节,那么previous_entry_length属性的长度为1字节,否则为5字节
  • 可以通过该指针遍历整个压缩列表

encoding

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

content

连锁更新

  • 添加新的节点或者删除新的节点导致出现连锁更新
  • 连锁更新在最坏情况下需要对压缩列表执行N次空间重分配操作,而每次空间重分配的最坏复杂度为O(N),所以连锁更新的最坏复杂度为O(N^(2))


压缩列表API

函数 作用 算法复杂度
ziplistNew 创建一个新的压缩节点 O(1)
ziplistPush 创建一个包含给定值的新节点,并将这个新节点添加到压缩列表的表头或者表尾 平均O(N),最坏O(N^(2))
ziplistInsert 将包含给定值的新节点插入到给定节点之后 平均O(N),最坏O(N^(2))
ziplistIndex 返回压缩列表给定索引上的节点 O(N)
ziplistFind 在压缩列表中查找并返回包含了给定值的节点 因为节点的值可能是一个字节数组,所以检查节点值和给定值是否相同的复杂度为O(N),而查找整个列表的复杂度则为O(N^(2))
ziplistNext 返回给定节点的下一个节点 O(1)
ziplistPrev 返回给定节点的前一个节点 O(1)
ziplistGet 获取给定节点所保存的值 O(1)
ziplistDelete 从压缩列表中删除给定的节点 平均O(N),最坏O(N^(2))
ziplistDeleteRange 删除压缩列表在给定索引上的连续多个节点 平均O(N),最坏O(N^(2))
ziplistBlobLen 返回压缩列表目前占用的内存字节数 O(1)
ziplistLen 返回压缩列表目前包含的节点数量 节点数量小于65535是为O(1),大于65535时为O(N)

猜你喜欢

转载自www.cnblogs.com/hhe0/p/9254782.html
今日推荐