链表和链表节点的实现
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;
虽然单独一个 listNode 就可以构成链表,但是 Redis 增加了 List 结构,能更方便的操作链表
数据为 void* 可以使用多态,操作各种数据类型.
总结
链表被广泛用于 Redis 的各种功能,比如列表建,发布与订阅,慢查询,监视器等.
每个链接节点由一个ListNode结构表示,每个几点都有一个指向前置节点和后置节点的指针,所以 Redis 的链表实现是双端链表.
每个链表使用一个 list 结构来表示,这个结构带有表头结点指针,标为节点指针,以及链表长度等信息.
因为链表表头节点的前置节点和表位节点的后置节点都指向NULL,所以Redis的链表是现实无环链表.
通过为链表设置不同的类型特定函数, Redis 的链表可以用于保存各种不同数据类型的值.