前言
链表作为一种常用的数据结构,会内置在很多高级的编程语言中,而Redis使用的C语言并没有内置链表数据结构,故redis构建了自己的链表实现
链表特性
-
顺序节点访问
-
高效节点重排
-
灵活调整链表长度
redis中的链表用途
链表在Redis的应用十分广泛,如列表键的底层实现之一就是链表
-
列表键
-
发布订阅
-
慢查询
-
监视器
-
保存客户端状态信息
-
构建客户端输出缓冲区
列表键
当一个列表键包含的元素数量比较多的时候(> 512)或列表中包含的元素都是比较长的字符串的时候(任一个元素 > 64字节),Redis就会使用链表作为列表键的底层实现,否则使用压缩列表数据结构实现,后续文章会介绍
链表在redis中的实现
使用list结构来表示链表,使用listNode来表示每一个链表节点
list
typedef struct list {
// 链表头节点
listNode * head;
// 链表尾节点
listNode * tail;
// 链表所包含的节点数量
unsiged long len;
// 操作节点函数...
}
listNode
typedef struct listNode {
// 前置节点
struct listNode * prev;
// 后置节点
struct listNode * next;
// 节点的值
void * value;
}
整体结构简图
链表结构图Redis链表特性
-
双端(每个节点都有前置/后置节点的指针)
-
无环(表头节点的prev指针和表尾节点的next指针均为null,即对链表的访问以null为终点)
-
带有表头指针和表尾指针(head和tail属性)
-
带链表长度计数器(len属性)
-
多态(指的是listNode节点保存的值的类型为void,可以保存各种不同类型的值)
总结
redis中自构建的链表数据结构,主要用于列表键的底层实现数据结构
网友评论