上一个博客Redis数据结构SDS介绍了Redis的简单动态字符串(SDS ),今天介绍了Redis的链接列表。
在实际说明Redis的linkedlist是如何实现的之前,您可以使用前面写的双向链表轻松进入双向链表。
版本: 3.0结构已在版本3.0的Redis源代码中进行了分析。 这个博客的配图来自Redis设计和实现写真集。
直接看看往常的规则,源代码吧。 地址: 3.0/src/adlist.h
节点首先说明构成链表的基础部分,对应于adlist.h的listNode :
类型结构列表{//前体节点结构列表* prev; //继承节点结构列表下一步; //节点值void *value; } listNode; 如上代码所示,一个节点有三个重要部分:前驱节点、后继节点和节点值。 双向链表中的ADT如上所示。 多个节点构成双向链表,如下图所示。
你认为到此为止,上图所示的链表就形成了吗? 不,我们才刚刚开始。
以下代码与adlist.h中的list相对应:
类型定义结构列表//头; //末尾节点listNode *tail; 如何复制//节点值void*(dup ) ) void *ptr ); //清空节点值的方法void (自由) ) void (ptr ); 用于比较//节点值的方法int (*匹配) ) void *ptr,void *key ); //链表的节点数unsigned long len; (}列表; 大致的图如下。
这个时候,我发现不是。 我们的普通链表一般不是由多个节点组成的吗? Redis的链表中为什么还保存头节点、尾节点和当前链表中的节点数呢?
分析前面提到的算法的时间复杂度和算法的空间复杂度,不是有在空间上改变时间的想法吗?
这个时候就是空间转换时间的具体表现。 我使用专用空间保存当前链表的头节点、当前链表的尾节点和当前链表的节点数。 就像刚才提到的线性列表吗? 获取某个头节点、尾节点和当前节点数的时间复杂度为o(1)。
版本: 3.2接下来写……(整理3.0的相关源代码,然后开始解读整理3.2源代码) ) ) ) )。
关联阅读Redis基础
Redis数据结构SDS
Redis数据结构链接列表
Redis数据结构hashtable
Redis数据结构skiplist
Redis数据结构压缩列表
Redis数据结构intset
Redis数据结构快速列表
Redis对象RedisObject