Redis构建了自己的链表实现,其中列表键的底层实现之一就是链表,Redis的发布订阅、慢查询、监视器等功能也使用到了链表。Redis服务器还使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端的输出缓冲区。
1.链表的数据结构
链表由一个或多个链表节点组成,每个链表节点都有prev和next指针,从而组成双端链表
// 链表节点
typedef struct listNode {
struct listNode *prev // 前置节点
struct listNode *next // 后置节点
void *value // 节点的值
}listNode
链表持有表头指针和表尾指针,其中表头指针的prev指针和表尾指针的next指针为null,即Redis链表是一个双向无环链表。链表还持有节点的数量。
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;
2.小结
- 链表节点持有前置节点和后置节点,因此获取某个节点的前置或后置节点的复杂度为O(1)
- 链表的表头节点的prev指针和表尾节点的next指针指向null,因此Redis的链表是无环的
- 链表保存了节点的数量,获取某个链表长度的复杂度为O(1)