链表作为一种常用的数据结构,因为C语言没有这种数据结构,Redis它自己构建了链表的实现,至于链表这种数据结构在此不做多介绍,请自行百度。本篇文章只是简单记录下Redis的链表实现。
Redis里的链表用处简介:发布订阅、慢查询、监视器等功能,Redis服务器本身还用链表来保存多个客户端的状态信息,和构建客户端输出缓冲区。
链表的数据结构如下
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;
以上就是Redis的链表实现,无环双端链表。包含了list结构和listNode结构。
链表属性介绍:
链表特性总结:
- 双端:链表节点都带有prex指针和nexr指针,复杂度都是O(1)
- 无环:表头节点的prex指针和尾节点的next指针都指向Null,都是以Null作为终点
- 带表头指针和表尾指针:通过List结构的head指针和tail指针,获取链表的表头节点和表尾节点复杂度都是O(1)
- 链表长度计数器:使用list结构的len属性得出链表节点的数量,复杂度为O(1)
- 多态:使用listNode结构的void *value来保存节点的值,使用list结构的dup、free、match三个属性为节点值设置类型特定函数,链表可以保存不同类型的值。