小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
4redis数据结构之list
redis构建了自己的链表实现
每个链表节点使用adlist.h里的listNode结构来表示:
/*
* 链表节点
*/
typedef struct listNode {
// 前驱节点
struct listNode *prev;
// 后继节点
struct listNode *next;
// 值
void *value;
} listNode;
多个listNode通过prev和next指针来组成双端链表
list持有这个链表
/*
* 链表
*/
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;
list结构为链表提供了表头指针,表尾指针,节点数量,dup free match函数用于实现多态链表
redis 的链表实现特性:
- 双端链表:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度为O(1)
- 无环链表:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
- 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)
- 带链表长度计数器:使用len属性来记录链表长度,获取节点数量的复杂度为O(1)
- 多态:可以保存不同类型的值
链表被广泛用于实现redis的各种功能,不如列表键,发布与订阅,慢查询,监视器等待。