【Redi设计与实现】第三章:链表

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redi设计与实现】第三章:链表


链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活的调整链表的长度。

链表在Redis中的应用十分的广泛,比如列表键的底层实现之一就是链表。当一个列表键包含来数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。

3.1 链表和链表节点的实现

每个链表节点使用一个 listNode 结构来表示:

typedef struct listNode{
  // 前置节点
  struct listNode * prev;
  // 后置节点
  struct listNode * next;
  // 节点的值
  void * value;
}listNode;

多个listNode可以通过prev和next指针组成双端链表,如图所示:

虽然,使用多个listNode就可以组成链表,但使用下面的list组成链表,操作起来更加的方便。

typedef struct list {
  // 链表的头节点
  listNode * head;
  // 链表的尾节点
  listNode * tail;
  // 链表包含的节点的数量
  unsigned long len;
  // 节点值复制函数
  void *(*dup)(void *ptr);
  // 节点值释放函数
  void (*free)(void *ptr);
  // 节点值对比函数
  int (*match)(void *ptr,void *key);
} list;

list结构为链表提供了表头指针head、表尾指针tail、以及链表长度计数器len,而dup、free、match成员则是用于实现多态链表所需的类型特定函数:

  • dup函数用于复制链表节点所保存的值;
  • free函数用于释放链表节点所保存的值;
  • match函数则对比链表节点所保存的值和输入的值是否相等。

如图所示,由一个list结构和三个listNode结构组成的链表。

Redis的链表实现的特征可以总结如下:

  • 双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。
  • 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点。
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的时间复杂度为O(1)。
  • 带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行技术,程序获取链表中的节点的数量的时间复杂度为O(1)。
  • 多态:链表节点使用void *指针保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型,所以,链表可以保存不同类型的值。

3.2 链表和链表节点的API

3.3 重点回顾

  • 链表被广泛用于实现redis的各种功能,比如列表键、发布订阅、慢查询、监视器。
  • 每个链表节点由一个listNode结构来表示,每个节点都有一个指向前置节点和后置节点的指针,所以Redis的链表实现的是双向链表。
  • 每个链表使用一个list来表示,这个结构带有表头指针、表尾指针,以及链表的长度等信息。
  • 因为链表头节点的前置节点的prev和后置节点的next都指向NULL,所以Redis实现的是无环链表。
  • 通过为链表设置不同的类型特定函数,Redis的链表可以用于存储各种不同类型的值。


相关文章
|
Dart Java 开发者
重磅开源|AOP for Flutter开发利器——AspectD
详细图解+代码,全面易懂
4890 0
|
机器学习/深度学习 人工智能 算法
用Python实现简单的聊天机器人
【8月更文挑战第31天】 本文将介绍如何使用Python语言和AIML库来实现一个简单的聊天机器人。我们将从基本的安装和配置开始,然后逐步深入到聊天机器人的实现过程。最后,我们将展示如何训练我们的机器人以使其更加智能。无论你是编程新手还是有经验的开发者,都可以从本文中获得实用的知识。
|
资源调度 前端开发 JavaScript
Tailwind CSS如何在vue项目中使用
Tailwind CSS如何在vue项目中使用
911 8
|
负载均衡 Kubernetes 算法
如何使用Docker来实现Nginx的负载均衡和反向代理
如何使用Docker来实现Nginx的负载均衡和反向代理
893 1
|
JavaScript
HTML DOM 允许我们通过触发事件来执行代码。
HTML DOM 允许我们通过触发事件来执行代码。
106 0
|
Kubernetes API Docker
cloud-controller-manager
cloud-controller-manager
875 0
|
Java Maven
Intellij IDEA导入JAVA项目并启动(哈哈哈,天天都有人问)
最近有很多同学,竟然不知道如何使用Intellij IDEA打开Java项目并启动 现在来讲一下,希望不要忘记了 1、打开IDEA开机页面 Maven项目 2、Maven项目是以pom文件引入各项jar包的 在点击lmport Project,然后在点击pom.
4454 0
|
20小时前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
3天前
|
云安全 监控 安全