Redis 中链表广泛应用于 列表键、发布订阅、慢查询、监视器 等功能中…
大家知道,链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活调整链表的长度
Redis 链表结构如下:
由上可见,Redis 的链表为一个 双向链表,它的一些特性:
双端
链表节点带有 prev / next 节点指针,获取 前置 / 后置 节点的复杂度为 O(1)无环
表头节点的 prev 和 表尾节点的 next 都指向 NULL,对链表的访问都是以 NULL 为终点head / tail
可以很容易的获取链表的 表头/表尾 节点数据,而且复杂度为 O(1)链表长度计数器
链表使用 len 属性对自身进行计数,而且操作复杂度为 O(1)多态
链表使用了 dup / free / match 三个属性去设置特定的函数,以适应 存储不同类型数据的 链表
另外,Redis 链表还为 双端链表 准备了 迭代器
功能,可以从两个方向对链表进行迭代遍历
下面我们就 Redis 链表的一些 典型的 API 进行解析~~~
源码解析
由于有些方法里的代码量比较大,我们这里按照 典型的代码片段进行解析,同志们可以根据文章提示的代码位置 和 代码里面的关键词 在源码中搜素,可能数据结构一些元素 看不太懂什么意思,没关系,先混个脸熟,后面看完回头再看过来就明白了
结构体简单操作的 宏定义
另外,
listCreate
链表创建函数,主要是 申请内存,以及结构初始化
listRelease
链表释放函数,这里需要分为两部分,结构内节点遍历释放、free 内存释放
跟上两个函数相比,反观 插入函数就会稍微复杂一些,主要提供了三种插入方式:
listAddNodeHead 头插法
listAddNodeTail 尾插法
listInsertNode 灵活插入法
listDup
链表复制函数
Redis 为连接另外提供了两个 查找函数,逻辑比较简单listSearchKey
根据给定的节点值查找节点,迭代遍历每个节点,使用 match 函数或者直接对比 的方法进行 查找 nodelistIndex
根据序号查找节点,序号为正数为顺序查找,负数为逆序查找
本文作者: wettper
本文链接: http://www.web-lovers.com/redis-source-adlist.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!