Redis设计与实现 第 3 章
第 3 章 链表
链表在 Redis 中应用广泛,如列表键的底层实现之一是链表
- 当一个列表键包含了数量比较多的元素
- 列表中包含的元素都是比较长的字符串时

integers 列表键包含了 [1, 1024] 共 1024 个整数,其底层实现就是链表,每个节点都保存了一个整数值
发布与订阅、慢查询、监视器等功能也使用到了链表,Redis 服务器本身也使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区
3.1 链表和链表节点的实现
每个链表节点使用一个 adlist.h/listNode 结构来表示

多个 listNode 通过 prev 和 next 指针组成双端链表

使用 adlist.h/list 来使用链表会方便

提供表头指针 head、表尾指针 tail,链表长度计数器 len
dup、free、match 成员为使用实现多态链表所需的类型特定函数
- dup:复制链表节点所保存的值
- free:释放链表节点所保存的值
- match:对比链表节点所保存的值和另一个输入值是否相等
链表举例:

特性:
- 双端:链表节点有 prev、next 指针,获取某个节点的前置、后置的复杂度为 O(1)
- 无环:表头节点的 prev 指针和表尾的 next 指针都指向 NULL,对链表的访问以 NULL 为终点
- 带有表头指针和表尾指针:获取表头节点和表尾节点的复杂度都为 O(1)
- 带有链表长度的计数器:获取链表节点数量的复杂度为 O(1)
- 多态:节点使用 void* 指针来保存节点的值,并可以通过dup、free、match 三个属性为节点值设置类型的特定函数,来保存各种不同类型的值
3.2 链表和链表节点的 API

浙公网安备 33010602011771号