redis 笔记(双端链表)

实现 Redis 的列表类型
<pre>
双端链表还是 Redis 列表类型的底层实现之一, 当对列表类型的键进行操作 —— 比如执行 [RPUSH]、 [LPOP] 或 [LLEN] 等命令时, 程序在底层操作的可能就是双端链表。
</pre>
<pre>
Redis 列表使用两种数据结构作为底层实现:
双端链表
压缩列表
因为双端链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩列表作为底层实现, 并且在有需要的时候, 才从压缩列表实现转换到双端链表实现。
</pre>
Redis 自身功能的构建
<pre>
除了实现列表类型以外, 双端链表还被很多 Redis 内部模块所应用:
事务模块使用双端链表依序保存输入的命令;
服务器模块使用双端链表来保存多个客户端;
订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
事件模块使用双端链表来保存时间事件(time event);
类似的应用还有很多 。
</pre>

Paste_Image.png

其中, listNode 是双端链表的节点:
<pre>
typedef struct listNode {
// 前驱节点
struct listNode *prev;
// 后继节点
struct listNode *next;
// 值
void *value;
} listNode;
</pre>
而 list 则是双端链表本身:
<pre>
typedef struct list {
// 表头指针
listNode *head;
// 表尾指针
listNode *tail;
// 节点数量
unsigned long len;
// 复制函数
void (dup)(void ptr);
// 释放函数
void (
free)(void ptr);
// 比对函数
int (
match)(void *ptr, void *key);
} list;
</pre>
注意, listNode 的 value 属性的类型是 void * ,说明这个双端链表对节点所保存的值的类型不做限制。
<pre>
对于不同类型的值,有时候需要不同的函数来处理这些值,因此, list 类型保留了三个函数指针 —— dup 、 free 和 match ,分别用于处理值的复制、释放和对比匹配。在对节点的值进行处理时,如果有给定这些函数,就会调用这些函数。
举个例子:当删除一个 listNode 时,如果包含这个节点的 list 的 list->free 函数不为空,就会先调用删除函数 list->free(listNode->value) 来清空节点的值,再执行余下的删除操作(比如说,释放节点)。
另外,从这两个数据结构的定义上,也可以了解到一些行为和性能特征:
listNode 带有 prev 和 next 两个指针,因此,遍历可以双向进行:从表头到表尾,表尾到表头。
list 保存了 head 和 tail 两个指针,因此,对链表的表头和表尾进行插入的复杂度都为 θ(1)θ(1) —— 这是高效实现 LPUSH 、 RPOP 、 RPOPLPUSH 等命令的关键。
list 带有保存节点数量的 len 属性,所以计算链表长度的复杂度仅为 θ(1)θ(1) ,这也保证了 LLEN 命令不会成为性能瓶颈。
</pre>
以下是用于操作双端链表的 API ,它们的作用以及算法复杂度:

Paste_Image.png

迭代器
<pre>
Redis 为双端链表实现了一个迭代器 , 这个迭代器可以从两个方向对双端链表进行迭代:
沿着节点的 next 指针前进,从表头向表尾迭代;
沿着节点的 prev 指针前进,从表尾向表头迭代;
以下是迭代器的数据结构定义:
typedef struct listIter {
// 下一节点
listNode *next;
// 迭代方向
int direction;
} listIter;
direction 记录迭代应该从那里开始:
如果值为 adlist.h/AL_START_HEAD ,那么迭代器执行从表头到表尾的迭代;
如果值为 adlist.h/AL_START_TAIL ,那么迭代器执行从表尾到表头的迭代;
</pre>
以下是迭代器的操作 API ,API 的作用以及算法复杂度:

Paste_Image.png

小结
<code>
Redis 实现了自己的双端链表结构。
双端链表主要有两个作用:
作为 Redis 列表类型的底层实现之一;
作为通用数据结构,被其他功能模块所使用;
双端链表及其节点的性能特性如下:
节点带有前驱和后继指针,访问前驱节点和后继节点的复杂度为 O(1)O(1) ,并且对链表的迭代可以在从表头到表尾和从表尾到表头两个方向进行;
链表带有指向表头和表尾的指针,因此对表头和表尾进行处理的复杂度为 O(1)O(1) ;
链表带有记录节点数量的属性,所以可以在 O(1)O(1) 复杂度内返回链表的节点数量(长度);
</code>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • redis使用两种数据结构保存链表,分别是ziplist与linkedlist,内存占用及常用操作效率各不相同。本...
    但莫阅读 1,190评论 0 1
  • 本文摘抄自redis源码学习笔记 双端链表在Redis中的地位:它作为一种通用数据结构,在Redis的内部使用非常...
    lintong阅读 1,323评论 0 2
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,062评论 0 12
  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 4,223评论 4 12
  • 相信大家都看到了北京八达岭野生动物园的老虎伤人事件,一名女子不顾园方的三令五申,依然因为一些琐事打开了车门,走下了...
    亲吻向日葵的月光阅读 631评论 0 0