Redis设计与实现——链表
Redis链表介绍
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。
链表结构
redis中每个链表(通过prev和next指针组成双向链表)节点使用一个adlist.c/listNode结构来表示:
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
}listNode;
使用adlist.h/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;
Redis链表实现的特性总结如下:
1)双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。
2)无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终结。
3)带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾结点的复杂度为O(1)。
4)带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行计数,程序获取链表中节点数量的复杂度是O(1)。
5)多态:链表节点使用void*指针来保存节点值,并可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以保存各种不同类型的值。
重点回顾:
1)链表被广泛用于实现redis的各种功能,比如列表键、发布与订阅、慢查询、监视器等。
2)每个链表节点由一个listNode结构来表示,每个节点都有一个指向前置节点和后置节点的指针,所以redis的链表实现是双向链表。
3)每个链表使用list结构来表示,这个结构带有头节点指针和表尾结点指针,以及链表长度等信息。
4)因为链表的表头节点的前置节点和表尾结点的后置节点都指向NULL,所以redis的链表是个无环链表。
5)通过为链表设置不同的类型特定函数,redis的链表可以用来保存各种不同类型的值。
日历
个人资料
diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(12)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
- 2018年关键字“走心”
2018-03-19 16:07
- 保护好自己最大的方法是让自己更强大,不要柔弱的像一只绵羊一样,得谁巴拉,就谁巴拉!
2017-12-20 10:24
发表评论: