概述

本文是根据Redis设计与实现相应的章节做出的编写,接着上一节sds动态字符串,这节我们将要学习链表。

链表的概述

线性表在各种语言中分为很多,比如:数组、队列、栈、链表。每种数据结构都有各自的特性。

链表相相对于数组这种线性结构来说,在插入方面的时间复杂度为O(1),而且底层不需要连续的内存,但是其根据关键字或者根据索引进行查找的话时间复杂度为O(N),所以在写多读少的情况下,使用链表更为高效

Redis中的链表

在Redis中,本身c语言底层没有链表这种结构,所以Redis自身抽象出了链表这种结构,我们来看下Redis如何实现链表的代码




redis 复杂查询 key规则 redis操作复杂度_redis 复杂查询 key规则

链表的每一个节点信息



我们可以看到,上图是Redis链表的最基本单元,即链表元素,里面包含了指向前置节点的引用和指向后置节点的引用,还有一个用来保存自身存储数据。

通过上面我们可以发现,Redis的链表是个双端链表,就是包含指向前置节点和指向后置节点的指针,这样通过一个节点获取前驱或者后继节点的时间复杂度就为O(1)

我们再来看下Redis如何组装这些节点信息的




redis 复杂查询 key规则 redis操作复杂度_使用动态链表实现字符的频度统计_02

Redis链表结构



我们可以看到,链表包含头节点、尾节点、实际链表的长度、包括一些相关函数。

这样如果给定链表来获取头节点或者尾节点的时间复杂度为O(1),并且获取链表的长度时间复杂度也为O(1)。

Redis的链表不是环形链表,所以在判断是否是最后一个节点时,直接判断listNode的next是否为null即可

链表在Redis中的运用

redis> LRANGE list 0 2

1) "1"

2) "2"

3) "3"

这样获取出来的集合值其实就是在Redis底层采用链表保存,其中每一个元素对应着链表的一个节点。

除了这里使用外,在其他地方,比如:发布/订阅、慢查询、监视器中也使用了链表,这个我们后面学习到了在做介绍。

好了,今天的内容就介绍到这,下一节我们一起来学习下字典这种数据结构。