0

0

深入聊聊Redis中的双链表

青灯夜游

青灯夜游

发布时间:2021-12-01 09:53:25

|

2947人浏览过

|

来源于掘金社区

转载

本篇文章带大家了解一下redis 数据结构中的双链表,简单介绍一下双链表的运用,希望对大家有所帮助!

深入聊聊Redis中的双链表

在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个双向的数据结构,而 list 数据结构正是双向链表,类似 java 中的 LinekdList 链表列表。【相关推荐:Redis视频教程

链表提供了高效的节点重排能力,以及顺序的节点访问方式,通过修改节点的 pre 和 next 指针来修改链表的数据。

C 语言没有内置链表的数据结构,所以 Redis 构建了自己的链表结构。

链表的数据结构,链表以及链表节点

链表是由链表以及链表节点组成,每个链表节点使用一个 adlist.h/listNode 结构来表示:

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

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

1.png

唱鸭
唱鸭

音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

下载

多个 listNode 可以组成链表,但是为了方便管理,使用 adlist.h/list 管理链表,list 结构如下:

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

list 结构为链表提供了表头指针 head、表尾指针 tail,以及节点数量计算 len。下图展示一个由 list 结构和三个 listNode 节点组成的链表:

2.png

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

  • 双向:链表节点带有 prev 和 next 指针,可以通过指针获取每一个数据
  • 快速计算链表长度:通过 list 结构中的 len 属性计算 list 的长度,而时间复杂度为O(1)
  • 多态: 链表节点使用 void* 指针保存节点,所以链表支持保存各种不同类型的值

双链表的运用

列表键,发布订阅、慢查询以及监视器等。

总结

  • 本文通过介绍链表的数据结构,链表是由链表和链表节点组成的
  • 链表节点都有一个前置和后置指针,所以 Redis 的链表是一个双向链表
  • 链表可以存储头结点,尾节点,更好的管理自己的节点,len 属性快速算出链表的长度
  • 链表通过 void* 以及不同的类型设定函数,所以链表可以不同的类型的值

更多编程相关知识,请访问:编程入门!!

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

805

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

724

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

727

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

395

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16861

2023.08.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号