redis数据结构-list
来源:互联网 发布:中科汇通知乎 编辑:程序博客网 时间:2024/06/02 12:15
reids数据结构-list
redis的几个数据结构中list相对来说能稍微好理解一些,它的数据结构底层实现是双向链表,因为链表用的比较多,对其数据结构也是比较熟悉。我们来看一看源码中的list是怎样的。
数据结构
redis的list定义在adlist.h中,在redis 2-x和redis高版本中redis 4-x中,list结构体的定义是一样的:
该文件中共有三个结构体的定义,listNode中是对链表节点的定义,一个prev前驱节点指针,next后继节点指针,以及该节点的值value。第二个结构体是list迭代器结构体,包含一个指向链表节点的next指针和一个标志迭代方向的direction(即正向迭代和逆向迭代)。第三个结构体是一个list的完整结构,表头head,表尾tail,以及链表长度len,和三个用于多态链表的特定函数,dup用于复制链表节点所保存的值,free用于释放节点值,match用于对比该节点值与另一给定值是否相等。内存结构
每一个链表的头和尾都指向listNode节点,多个listNode构成由prev和next构成一个无环双向链表,同时支持使用迭代器进行节点迭代。节点空间的开辟是由malloc函数完成,释放也是使用free函数。链表的创建过程调用背部封装的zmalloc函数。zmalloc.h中封装了malloc,calloc,realloc这三个基础函数。链表特性
1.时间复杂度
redis链表使用len来标记链表长度,这样获取链表长度时间复杂度就为O(1),head和tail指针,查找链表的头和尾时间复杂度为O(1),同时对于链表节点有prev和next指针,所以获取某个节点的前驱节点和后继节点的时间复杂度也为O(1)。
2.多态
redis提供一系列特定API,如dup,free,match函数,能够很方便的通过链表结构中的dup,free,match属性以O(1)复杂度直接获得相应操作结果。除一些复杂操作函数例如删除给定节点,释放给定链表等操作需要时间复杂度为O(n),其余操作大多在常数级,可以看出效率非常高。- 使用场景
redis内部使用链表数据结构实现了列表键,还应用于发布订阅,慢查询,监视器等,使用lpush,lpop或是rpush或rpop来生成队列结构,使用lpush,rpop或是rpush,lpop来实现栈结构。
- redis数据结构指南:list
- redis数据结构-list
- Redis数据结构-List
- Redis的数据结构之List
- Redis中的数据结构-String与List
- Redis数据结构和内部编码--列表(list)
- Redis数据结构详解之List(二)
- Redis数据结构详解之List(二)
- Redis数据结构list的任务队列
- Redis-数据结构(字符串列表list)
- Redis数据结构详解之List(二)
- 【Redis笔记(四)】 Redis数据结构 - list链表
- RedisTemplate访问Redis数据结构(二)——List
- 【Redis源码剖析】 - Redis内置数据结构之双向链表list
- redis--List
- redis-list
- redis List
- Redis-List
- 3. Longest Substring Without Repeating Characters
- 奶爸英语学习课程要点(第9课, 英语语法与阅读, 中高级)
- UFLDL 教程学习笔记:2.矢量化编程实现
- 笔记:udacity计算机科学导论- 课程11/12-14 数组值的改变和增加
- Java 线程池源码解析
- redis数据结构-list
- Spring boot 使用详解
- beego模板语法
- 20BEquation
- BP神经网络Python实现异或问题
- 疯狂Activiti6.0连载(27)BPMN中间事件
- UFLDL 教程学习笔记:3.预处理-主成分分析与白化
- Kotlin-1.2-包和导入
- shell 脚本调试