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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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的链表可以用于存储各种不同类型的值。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
存储
第二章链表
第二章链表
15 0
|
2月前
|
编译器 Linux C语言
第五章 栈与队列
第五章 栈与队列
19 0
|
6月前
|
存储 算法
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
66 0
|
7月前
|
存储 算法 索引
数据结构与算法④(第二章下)链表概念+单链表的实现
数据结构与算法④(第二章下)链表概念+单链表的实现
44 0
|
7月前
|
存储 算法
数据结构与算法⑪(第四章_中)堆的分步构建
数据结构与算法⑪(第四章_中)堆的分步构建
35 0
|
7月前
|
C语言
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
186 0
|
7月前
|
存储 算法 Serverless
【软件设计师备考 专题 】数据结构深度解析:从数组到图
【软件设计师备考 专题 】数据结构深度解析:从数组到图
98 0
|
7月前
|
存储 缓存 算法
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
621 0
|
7月前
|
缓存 前端开发 算法
前端算法基础-链表
前端算法基础-链表
58 1
|
7月前
|
NoSQL API Redis
【Redi设计与实现】第五章:跳跃表
【Redi设计与实现】第五章:跳跃表