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来实现栈结构。