链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式。
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;
- dup 函数用于复制链表节点所保存的值
- free 函数用于释放链表节点所保存的值
- match 函数用于对比链表节点所保存的值和另一个输入值是否相等
redis 链表实现特性:
- 双端:带有prev和next指针
- 无环:表头节点的prev指针和表尾节点的next指针都指向NULL
- 带表头指针和表尾指针:获取链表头尾节点复杂度为o(1)
- 带链表长度计数器:获取链表中节点数量的复杂度为O(1)
- 多态:可以通过dup,free,match三个属性为节点值设置类型特定函数
重点
- 链表被广泛用于Redis的各种功能,比如列表键,发布与订阅,慢查询,监视器等
- 每个链表节点由一个listNode结构来表示,每个链表都有一个指向前置节点和后置节点的指针
- 每个链表使用一个list结构来表示,这个结构带有表头节点指针,表尾节点指针