Redis数据结构大量使用双链表,实现在Adlist.h、Adlist.c文件中
双链表结构定义:
链表节点
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
链表
typedef struct list {
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);
unsigned long len;
} list;
同时redis还实现了迭代器
typedef struct listIter {
listNode *next;
int direction;
} listIter;
Redis 自身功能的构建
除了实现列表类型以外, 双端链表还被很多 Redis 内部模块所应用:
- 事务模块使用双端链表依序保存输入的命令;
- 服务器模块使用双端链表来保存多个客户端;
- 订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
- 事件模块使用双端链表来保存时间事件(time event);
以下是用于操作双端链表的 API ,它们的作用以及算法复杂度:
| 函数 | 作用 | 算法复杂度 |
|---|---|---|
listCreate | 创建新链表 | O(1) |
listRelease | 释放链表,以及该链表所包含的节点 | O(N) |
listDup | 创建给定链表的副本 | O(N) |
listRotate | 取出链表的表尾节点,并插入到表头 | O(1) |
listAddNodeHead | 将包含给定值的节点添加到链表的表头 | O(1) |
listAddNodeTail | 将包含给定值的节点添加到链表的表尾 | O(1) |
listInsertNode | 将包含给定值的节点添加到某个节点的之前或之后 | O(1) |
listDelNode | 删除给定节点 | O(1) |
listSearchKey | 在链表中查找和给定 key 匹配的节点 | O(N) |
listIndex | 给据给定索引,返回列表中相应的节点 | O(N) |
listLength | 返回给定链表的节点数量 | O(1) |
listFirst | 返回链表的表头节点 | O(1) |
listLast | 返回链表的表尾节点 | O(1) |
listPrevNode | 返回给定节点的前一个节点 | O(1) |
listNextNode | 返回给定节点的后一个节点 | O(1) |
listNodeValue | 返回给定节点的值 | O(1) |
本文详细介绍了Redis中双端链表的结构定义、实现及其在Redis内部功能构建中的应用,包括事务模块、服务器模块、订阅/发送模块等。此外,还概述了用于操作双端链表的API及其算法复杂度。

162

被折叠的 条评论
为什么被折叠?



