Redis 源码解析 string内部实现原理之链表
2017-01-15 20:29
597 查看
在Redis中,链表提供了高效的节点重排能力,以及顺序性地节点访问方式,并且可以通过增删节点来灵活的调整链表的长度。比如redis中的列表结构就是使用了链表来实现,同时一些发布与订阅的需求也可以使用Redis的链表来实现。
下面给出Redis中链表和链表中节点的定义。
1.链表节点的结构定义
链表是一个双端链表,其中包含了prev前置节点和next后置节点,其中value存储的是真正的数据,之所以类型是void*是为了实现多态,可以存储任何类型的数据。
2.链表的结构定义
head代表了表头节点,tail代表了表尾部节点,所以对Redis中的list结构找表头和表尾节点的时间复杂度都是O1,len代表链表中所包含的节点数量,dup是代表了节点值复制函数,free代表了节点值释放函数,match代表了节点值对比函数。
3.Redis的链表实现的特性可以总结如下
1.双端 可以很方便的查询任何一个节点的前置节点和后置节点
2.无环 对链表的访问以NULL结尾
3.带有表头和表尾指针 常数复杂度查找到表头和表尾
4.带有链表长度计数器
5.多态 可以存储任何类型的数据。
下面给出Redis中链表和链表中节点的定义。
1.链表节点的结构定义
typedef struct listNode{ struct listNode *prev; struct listNode * next; void* value }listNode;
链表是一个双端链表,其中包含了prev前置节点和next后置节点,其中value存储的是真正的数据,之所以类型是void*是为了实现多态,可以存储任何类型的数据。
2.链表的结构定义
typedef struct list{ listNode *head; listNode *tail; unsigend long len; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr,void *key); }list;
head代表了表头节点,tail代表了表尾部节点,所以对Redis中的list结构找表头和表尾节点的时间复杂度都是O1,len代表链表中所包含的节点数量,dup是代表了节点值复制函数,free代表了节点值释放函数,match代表了节点值对比函数。
3.Redis的链表实现的特性可以总结如下
1.双端 可以很方便的查询任何一个节点的前置节点和后置节点
2.无环 对链表的访问以NULL结尾
3.带有表头和表尾指针 常数复杂度查找到表头和表尾
4.带有链表长度计数器
5.多态 可以存储任何类型的数据。
相关文章推荐
- Redis 源码解析 string内部实现原理之简单动态字符串SDS
- 秋色园QBlog技术原理解析:博客一键安装工具技术实现[附源码下载]
- Android 带你从源码的角度解析Scroller的滚动实现原理
- Android 属性动画 源码解析 深入了解其内部实现
- Android 带你从源码的角度解析Scroller的滚动实现原理
- ContentProvider和Cursor以及CursorAdapter三者之间内部链接实现原理 解析
- Redis源码解析4 - 数据类型之 String & List
- Android 带你从源码的角度解析Scroller的滚动实现原理
- 【Android】带你从源码的角度解析Scroller的滚动实现原理
- Android 属性动画 源码解析 深入了解其内部实现
- Android 带你从源码的角度解析Scroller的滚动实现原理
- 深入redis内部--实现双向链表
- Android 带你从源码的角度解析Scroller的滚动实现原理
- 笔记:深入解析MapReduce架构设计与实现原理 第6章 JobTracker 内部实现
- 快速傅里叶变换(FFT)的原理、实现及代码解析(附C#源码)
- Android 带你从源码的角度解析Scroller的滚动实现原理
- Android 带你从源码的角度解析Scroller的滚动实现原理
- Redis实现原理(1)--链表
- android 带你从源码的角度解析Scroller的滚动实现原理
- Android 带你从源码的角度解析Scroller的滚动实现原理