一、节点结构
typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNode;
二、链表结构
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链表特点
- 链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布与订阅, 慢查询, 监视器, 等等。
- 每个链表节点由一个
listNode
结构来表示, 每个节点都有一个指向前置节点和后置节点的指针, 所以 Redis 的链表实现是双端链表。 - 每个链表使用一个
list
结构来表示, 这个结构带有表头节点指针、表尾节点指针、以及链表长度等信息。 - 因为链表表头节点的前置节点和表尾节点的后置节点都指向
NULL
, 所以 Redis 的链表实现是无环链表。 - 通过为链表设置不同的类型特定函数, Redis 的链表可以用于保存各种不同类型的值。(多态)