【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的链表可以用于存储各种不同类型的值。


相关实践学习
基于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月前
|
存储 缓存 算法
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
59 0
|
4月前
|
存储 编译器 测试技术
速学数据结构 | 手把手教你会单链表的构建方式
速学数据结构 | 手把手教你会单链表的构建方式
35 0
|
5月前
|
存储 Java C++
数据结构单链表之C 中的通用链表 | 第十六套
数据结构单链表之C 中的通用链表 | 第十六套
33 1
|
9月前
|
存储
【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能
【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能
95 0
|
9月前
【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能(2)
【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能(2)
46 0
|
存储 算法
【基础篇】5 # 链表(下):写好链表代码的六个实用技巧
【基础篇】5 # 链表(下):写好链表代码的六个实用技巧
68 0
【基础篇】5 # 链表(下):写好链表代码的六个实用技巧
|
存储 C语言
《C语言程序入门——链表基础知识》单、双向链表概念、链表与数组优缺点1.1.6
{Type data;}Node;此处的Type data;是数据部分,用于保存该节点的实际数据。是地址部分,保存的是下一个节点的地址。
《C语言程序入门——链表基础知识》单、双向链表概念、链表与数组优缺点1.1.6
数据结构上机实践第五周项目1- 建立顺序栈算法库
数据结构上机实践第五周项目1- 建立顺序栈算法库
数据结构上机实践第五周项目1- 建立顺序栈算法库
【数据结构】队列的基本概念 | 从零开始实现队列 | 利用思路草图将思路转变为代码
本章我们将学习 "队列" ,首先介绍队列的概念和结构,然后我们将着重讲解栈的实现。我们从零开始写队列的接口,并从零开始步步解读。本章将继续巩固画思路草图的能力,只要思路草图画好了,就可以很轻松地将其转换成代码。
123 0
【数据结构】队列的基本概念 | 从零开始实现队列 | 利用思路草图将思路转变为代码
|
存储 机器学习/深度学习 算法
数据结构 第六章 图
数据结构 第六章 图
74 0
数据结构 第六章 图