我知道点redis-数据结构与对象(链表)
使用
- 链表键
- 发布与订阅
- 慢查询
- 监视器
- 保存多个客户端的状态信息
- 构建客户端输出缓冲区
3.1 链表和链表节点得儿实现
//链表节点
typedef struct listNode {
//前置节点
struct listNode *prev;
//后置节点
struct listNode *next;
//节点的值
void *value;
}listNode;
虽然仅仅使用多个listNode结构就可以组成链表,但使用adlist.h/list来持有链表的话,操作会更方便:
//链表
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;
redis的链表实现的特性可以总结如下:
- 双端:带有prev和next指针,获取前置节点和后置节点的复杂度为
O(1)
; - 无环:表头节点的prev指针和表尾节点的next都指向null,对链表的访问以null为终点;
- 带表头指针和表位指针:程序获取链表的表头节点和表尾节点的复杂度为
O(1)
; - 带链表长度计数器:程序获取链表中节点数量的复杂度为
O(1)
; - 多态:链表以
void*
指针来保存节点值,可以通过dup
、free
、match
三个属性为节点值设置类型特定函数;