Redis——链表
由于Redis使用C语言来编写的,而C语言中并没有像其他语言一样拥有自己内置的数据结构,显然链表在C语言中也没有内置的,故Redis实现了自己的链表结构
链表在Redis中应用十分广泛,如列表的底层实现之一
就是链表,当一个列表中的元素比较多或者列表中包含的元素是比较长的字符串时,Redis就会使用链表来作为列表的底层实现,并被用于发布/订阅,保存客户端状态信息,客户端输出缓冲区
等等
链表和链表节点的实现
链表节点被定义在adlist.h
下的 listNode
结构体中
typedef struct listNode {
//前驱节点
struct listNode *prev;
//后继节点
struct listNode *next;
//使用void来修饰节点的value值,表示该节点的值可以是任何类型,相当于Java中的Object
void *value;
}listNode;
虽然能够使用多个链表节点结构来表示一各链表,但Redis并没有这么做,为了方便用户操作链表,在adlist.h
中定义了list
结构体,来表示整个链表结构,并提供了相关属性和方法
typedef struct list {
//链表的头节点
listNode *head;
//链表的尾节点
listNode *tail;
//链表长度
unsigned long len;
//指向获取节点元素值的方法dup
void *(*dup) (void *ptr);
//指向删除节点的方法free
void (*free)(void *ptr);
//指向匹配输入值与链表节点值是否相等的方法match
int (*match)(void *ptr,void *key);
}list;
Redis链表节点特点
- 双向无环:每个链表节点有前驱节点和后继节点,头节点的前驱为null,尾节点的后继为null
- 带有链表长度属性:获取链表长度的时间复杂度为O(1)
链表API
函数 | 作用 |
---|---|
listSetDupMethod | 将给定函数设置为链表节点值的复制函数 |
listGetDupMethod | 返回链表当前正在使用的节点值复制函数 |
listLength | 返回链表的长度 |
listFirst | 返回链表的头节点 |
listLast | 返回链表的尾节点 |
listNodeValue | 返回给定节点的值 |
listPrevNode/listNextNode | 返回链表当前节点的前驱/后继节点 |