Redis链表
Redis使用的c语言并没有内置链表这种数据结构,所以Redis构建了自己的链表实现
列表键额底层实现之一是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。
链表被广泛用于实现Redis的各种功能,比如列表键,发布与订阅,慢查询和监视器等。
链表和链表节点的实现:
typedef struct listNode{
//前置节点
struct listNode *prev;
//后置节点
struct listNode *next;
//节点的值
void *value;
}listNode;
可以通过prev和next组成双端链表
可以使用adlist.h/list持有链表,以方便操作
typedef struct list{
//前置节点
struct listNode *head;
//后置节点
struct 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指针
无环:表头结点的prev和表位节点的next都指向null,对链表的访问以NULL为终点
带表头指针和表为指针:list结构提供了head头指针和tail尾指针
链表长度计数器
多态:使用void*指针保存节点值,链表可以用于保存各种不同类型的值