快速整明白Redis中的压缩列表到底是个啥

举报
万猫学社 发表于 2022/03/05 23:07:35 2022/03/05
【摘要】 压缩列表简介压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值。它是Redis为了节省内存空间而开发的。压缩列表(ziplist)是哈希(hash)和有序集合(zset)的内部编码之一。当哈希(hash)中的元素个数比较少并且每个元素的值占用空间比较小的时候,Redis就会使用压缩列表做为哈希的内部编码。...

压缩列表简介

压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值。它是Redis为了节省内存空间而开发的。

压缩列表(ziplist)是哈希(hash)和有序集合(zset)的内部编码之一。当哈希(hash)中的元素个数比较少并且每个元素的值占用空间比较小的时候,Redis就会使用压缩列表做为哈希的内部编码。当有序集合(zset)中的元素个数比较少并且每个元素的值占用空间比较小的时候,Redis也会使用压缩列表做为有序集合的内部编码。

压缩列表结构

接下来,我们来看以下压缩列表的内部构造,压缩列表由以下几个部分组成:

  • zlbytes:表示整个压缩列表占用的内存字节数。
  • xltail:表示压缩列表起始地址到最后一个节点的字节数,可以快速找到最后一个节点。
  • zllength:表示压缩列表包含的节点个数。
  • entries:节点列表,一个挨着一个地紧凑存储。
  • zlend:特殊值0xFF(十进制为255),表示压缩列表的结束。

压缩列表节点结构

每个压缩列表的节点由三部分组成: prevlenencodingcontent

prevlen

prevlen:表示该节点前一个节点的字节长度。 prevlen的长度可能是1个字节,也可能是5个字节。

当前一个节点的长度小于254个字节时, prevlen的长度为1个字节,直接存储前一个节点的字节长度;

当前一个节点的长度大于或等于254个字节时, prevlen的长度为5个字节,其中的第一个字节被设置为0xFE,随后的四个字节保存前一个节点的字节长度。

可以通过 prevlen和压缩列表结构中的xltail逆序遍历压缩列表。

encoding

encoding表示该节点中保存数据的类型和长度。

encoding的最高位以00开头时,表示最大长度为63的短字符串,此时encoding的长度为1个字节,其后面6个位表示字符串的字节长度;

encoding的最高位以01开头时,表示最大长度为16383的中等长度的字符串,此时encoding的长度为2个字节,其后面14个位表示字符串的字节长度;

encoding的最高位以10开头时,表示最大长度为4294967295的特长的字符串,此时encoding的长度为5个字节,其后面4个字节表示字符串的字节长度;

encoding的最高位以11开头时,表示整数值,此时encoding的长度为1个字节,其后面6个位表示整数值的类型和长度。

content

content用于存储节点的值,节点的值可以是一个字节数组,也可以是正数,其类型和长度由encoding决定。

总结

压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构。

一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值。

压缩列表(ziplist)是哈希(hash)和有序集合(zset)的内部编码之一。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。