【Redis】数据结构与对象(六种底层数据结构)——链表
链表
(1)链表和链表节点的定义
链表上节点定义如下:adlist.h/listNode
typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 节点值
void *value;
} listNode;
l链表的定义如下,adlist.h/list
typedef struct list {
// 链表头节点
listNode *head;
// 链表尾节点
listNode *tail;
// 节点值复制函数
void *(*dup)(void *ptr);
// 节点值释放函数
void (*free)(void *ptr);
// 节点值对比函数
int (*match)(void *ptr, void *key);
// 链表所包含的节点数量
unsigned long len;
} list;
每个节点listNode
可以通过prev
和next
指针分布指向前一个节点和后一个节点组成双端链表,同时每个链表还会有一个list
结构为链表提供表头指针head
、表尾指针tail
、以及链表长度计数器len
,还有三个用于实现多态链表的类型特定函数
dup
:用于复制链表节点所保存的值free
:用于释放链表节点所保存的值match
:用于对比链表节点所保存的值和另一个输入值是否相等
链表结构图
(2)链表特性
- 双端链表:带有指向前置节点和后置节点的指针,获取这两个节点的复杂度为O(1)
- 无环:表头节点的
prev
和表尾节点的next
都指向NULL,对链表的访问以NULL结束、 - 带表头指针和表尾指针:通过list结构和head指针和tail指针,程序获取链表的表头节点和表位节点的复杂度为O(1)
- 链表长度计数器:带有
len
属性,获取链表长度的复杂度为O(1) - 多态:链表节点使用
void*
指针保存节点值,可以保存不同类型的值
(3)redis中链表的应用
被用于实现redis的各种功能,如列表键,发布与订阅,慢查询,监视器等
参考:《Redis设计与实现》