双端链表是redis列表类型的底层实现之一,当对列表类型的键进行操作时,例如RPUSH,LPOP,LLEN,等命令时,程序在底层操作的可能就是双端链表。
//eg:
RPUSH brands Apple Microsoft Google
(integer)3
LPOP brands
"Apple"
LLEN brands
(integer)2
LRANGE 0 -1
"Microsoft"
"Google"
双端链表的功能
1.实现redis的列表类型
2.事务模块使用双端链表按顺序保存输入的命令
3.服务器模块使用双端链表保存客户端
4.订阅、发送模块使用双端链表保存时间事件
5.事件模块使用双端链表来保存时间事件
双端链表的实现
//节点
//前驱节点
struct listNode *prev;
//后继结点
struct listNode *next;
//值
void *value;
}listNode;
//双端链表
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;
迭代器
redis提供的迭代器可以从两个方向对双端链表进行迭代
沿着节点的next指针前进,从表头到表尾进行迭代
沿着节点的prev指针前进,从表尾到表头进行迭代
typedef struct listIter{
//下一节点
listNode *next;
//迭代方向
int direction;
}listIter;
小结:
1.redis实现了双端链表结构
2.双端链表结构主要有两个作用
-作为redis列表类型的底层实现之一
-作为通用数据结构,被其它功能模块所使用
3.双端链表及其节点的性能特性如下
-节点带有前驱和后继指针,访问其前驱和后继指针的复杂度为O(1), 并且对链表的迭代可以从表头到表尾或者从表尾到表头
-链表带有指向表头和表尾的指针,因此对表头或表尾进行处理的复杂 度为O(1)
-链表带有记录节点数量的属性,所以可以在O(1)复杂度内返回链表的 长度。