链表作为一种常用的数据结构,内置在很多高级变成语言中,因为Redis使用的C语言中没有内置这种数据结构,所以Redis构建了自己的链表
每一个链表节点用一个 listNode 来表示
typeof struct listNode { //前置节点 struct listNode * prev; //后置节点 struct listNode * next; //节点的值 void * value; }listNode
多个 listNode 可以通过 prev 和 next 来组成双端链表
Reids 还维护了一个 list 结构来持有链表,操作更加方便
typeof 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 为终点;
- 带有表头和表尾指针:通过 list 结构的 head 和 tail 指针,获取表头节点和表尾节点的复杂度为O(1);
- 带有链表长度计数器:通过 list 结构的 len 属性来对 list 持有节点进行计数,获取节点数量复杂度为O(1);
- 多态:链表节点使用 void* 指针来保存节点值,可以保存各种不同类型的值;
用于操作列表和列表节点的API
本文参考《Redis设计与实现》