暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【017】-Redis-数据结构-List源码查看

花好夜猿 2020-09-20
211

点击

蓝色

字体催更



在 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-size

  • compress 对应 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


2:表示 quicklist 两端各有2个 quicklist node 节点不压缩,中间的其他 quicklist 节点进行压缩


文章转载自花好夜猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论