定义
adlist.h
typedef struct listNode{
struct listNode *prev;
struct listNode *next;
void *value;
}
可以看出,redis的链表是一个双向链表,拥有前驱和后继,数据域为void型指针,意味着数据域可以指向需要的类型。
管理链表
adlist.h
typedef struct list{
listNode *head;
listNode *tail;
unsigned long len;
//节点复制函数
void *(*dup)(void *ptr);
//节点释放函数
void (*free)(void *ptr);
//节点比较函数
int (*match)(void *ptr,void *key);
}
容易看出,为了管理链表,redis定义了一个结构体,会去存储链表头、尾、和长度。这样的好处在于求链表长度时间复杂度为O(1),而且便于去找到靠近尾的节点(或者说可以直接进行倒序查找/遍历)。
另为,有着三个函数指针。进行分析。