点击
蓝色
字体催更

在 Redis 3.2 后,列表的编码格式只有一种,就是 quicklist,quicklist 编码格式逻辑图如下

quicklist 是一个双向链表,链表每个节点使用 ziplsit 来存储 , ziplist 本身也是一个链表。
本次通过简单查阅 quicklist 部分源码,来加深对 quicklist 以及相关参数阈值的了解。
quicklist 代码定义在了 quicklist.h 的文件中。
打开,quicklist.h 文件,在文件开头的注释中,也提到了 quicklist 是一个双向链表,相关 doc 信息如下:

接下来对照 quicklist 逻辑图,查看 quicklist 代码结构定义。
quicklist 代码结构定义
通过链接单个的节点对象所形成的数据结构就是链表,而链表以代码的方式来表示通常需要两层结构定义:
1、链表结构定义
2、链表节点定义
先来看 quicklist 编码格式的结构定义,相关代码定义如下:

如图所示,链表结构定义包含了 头尾节点指针,节点统计数据信息等。
除了链表基础信息,quicklist
结构还定义了两个属性值 fill
和 compress
,这样两个属性用来定义 quicklist 的存储策略,关于这两个属性策略的部分源码稍后在看。
了解 quicklist链表定义后,来看链表的节点的结构定义,结构定义代码如下:

从上述代码方法 doc 描述能够知道
quicklistNode is a 32 byte struct describing a ziplist for a quicklist.
quicklistNode 使用 32 字节来描述 ziplist 在 quicklist 中的结构定义。
根据上述代码,结合对照quicklis 逻辑图,想必对 quicklist编码结构有了更深刻的了解。
quicklist 结构定义中两个策略属性值
回到 quicklist 结构定义中两个策略属性值所对应的配置信息
fill 值对应
list-max-ziplist-sizecompress 对应
list-compress-depth
这两个参数的定义,可以回顾上一章。
下面通过简单的代码查看,这个两个参数的取值范围。
以 lpush 作为追踪入口,对应的 c 文件为 t_list.c
,对应函数入口 lpushCommand
,追踪时序图如下:

相关处理源码如下:

从代码能够知道:
list-max-ziplist-size
的取值范围为[-5,2^15]
负数表示使用字节数来限制每个node节点上 ziplist 的字节数大小
整数表示使用entry 个数来限制每个 node 节点上 ziplist 的长度list-compress-depth
的取值范围为[0,2^16]
表示 qicklist 两端不被压缩的 node(表示quicklist双向链表的节点而非ziplist节点) 节点个数,而被压缩的 node 节点所对应的 ziplist 结构会在ziplist压缩的基础上在进行一次压缩。
【回复:Redis资料包】
获取相关 Redis 资料,资料实时更新....
end




