链表 -《Redis设计与实现》读书笔记
使用场景
- 当列表键包含数量比较多的元素 或者 列表包含的元素都是比较长的字符串时,使用链表实现列表键
- 发布与订阅、慢查询、监视器
- 用作缓冲区:构建客户端输出缓冲区
- 保存多个客户端的状态信息
定义
// 节点
typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 节点的值
// 由于使用void *指针保存节点值,所有可以保存各种不同类型的值
void *value;
} listNode;
// 迭代器
typedef struct listIter {
listNode *next;
int direction;
} listIter;
// 列表
// 特点:双端、无环、带表头表尾指针、带链表长度计数器、多态
typedef struct list {
// 表头节点
listNode *head;
// 表尾节点
listNode *tail;
// dup、free、match是用于实现多态链表所需的类型特定函数
// 节点值复制函数:复制链表节点所保存的值
void *(*dup)(void *ptr);
// 节点值释放函数:释放链表节点所保存的值
void (*free)(void *ptr);
// 节点值对比函数:对比链表节点所保存的值和另一个输入值是否相等
int (*match)(void *ptr, void *key);
// 链表所包含的节点数量
unsigned long len;
} list;
源码阅读
- 文件:src/adlist.h 、 src/adlist.c
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。