Redis 5.0紧凑列表结构.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

源码6:破旧立新——探索「紧凑列

表」

Redis5.0又引入了一个新的数据结构listpack,它是对ziplist结构的改进,

在空间上会更加节省,而且结构上也比ziplist要精简。它的整体形式

和ziplist还是比较接近的,如果你认真阅读了ziplist的结构分析,那么

listpack也是比较容易理解的。

structlistpackT{

int32total_bytes;//占用的总字节数

int16size;//元素个数

T[]条目;//紧凑排列的元素列表

int8end;//同zlend一样,恒为0xFF

}

首先这个listpack跟ziplist的结构几乎一摸一样,只是少了一个

zltail_offset字段。ziplist通过这个字段来定位出最后一个元素的位

置,用于逆序遍历。不过listpack可以通过其它方式来定位出最后一个元

素的位置,所以zltail_offset字段就省掉了。

源码6:破旧⽴新——探索「紧

凑列表」

Redis5.0⼜引⼊了⼀个新的数据结构listpack,它是对ziplist结

构的改进,在空间上会更加节省,⽽且结构上也⽐ziplist要精

简。它的整体形式和ziplist还是⽐较接近的,如果你认真阅读了

ziplist的结构分析,那么listpack也是⽐较容易理解的。

structlistpackT{

int32total_bytes;//占⽤的总字节数

int16size;//元素个数

T[]entries;//紧凑排列的元素列表

int8end;//同zlend⼀样,恒为0xFF

}

⾸先这个listpack跟ziplist的结构⼏乎⼀摸⼀样,只是少了⼀

个zltail_offset字段。ziplist通过这个字段来定位出最后⼀个

元素的位置,⽤于逆序遍历。不过listpack可以通过其它⽅式来定

位出最后⼀个元素的位置,所以zltail_offset字段就省掉了。

structlpentry{

int变量编码;可选字节[]内

容;int变量长度;

}

元素的结构和ziplist的元素结构也很类似,都是包含三个字段。不同的是长

度字段放在了元素的尾部,而且的不是上一个元素的长度,是当前元素

的长度。正是因为长度放在了尾部,所以可以省去了zltail_offset字段

来标记最后一个元素的位置,这个位置可以通过total_bytes字段和最后

一个元素的长度字段计算出来。

长度字段使用varint进行编码,不同于skiplist元素长度的编码为1个字

节或者5个字节,listpack元素长度的编码可以是1、2、3、4、5个字节。

同UTF8编码一样,它通过字节的最高为是否为1来决定编码的长度。

同样,Redis为了让listpack元素支持多种类型,它对encoding字段也

进行了较为复杂的设计。

1.0xxxxxxx表示非负小整数,可以表示0~127。2.10xxxxxx表示

小字符串,长度范围是0~63,content字段为字符串的内容。3.110xxxxx

yyyyyyyy表示有符号整数,范围是‑2048~2047。4.1110xxxxyyyyyyyy

表示中等长度的字符串,长度范围是0~4095,content字段为字符串的内

容。5.aaaaaaaabbbbbbbbccccccccdddddddd表示大字

符串,节表示长度,content字段为字符串内容。6.

aaaaaaaabbbbbbbb表示2字节有符号整数。7.aaaaaaaa

bbbbbbbbcccccccc表示3字节有符号整数。

structlpentry

{intvarencoding;

optionalbyte[]content;

intvarlength;

}

元素的结构和ziplist的元素结构也很类似,都是包含三个字段。不

同的是⻓度字段放在了元素的尾部,⽽且的不是上⼀个元

文档评论(0)

ericxiao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档