Redis底层数据结构之双端链表

2.redis学习笔记:redis List底层数据实现(通用双端链表) redis List底层数据实现redis列表使用两种数据结构左为底层实现: 1.双端链表 2.压缩列表今天我们来介绍redis中的双端链表,在前边的数据结构章节中已经介绍了通用双端链表的实现,在redis数据库中,双端链表还被很多内部模块所应用: 1.事务模块使用双端链表依序保存输入的命令; 2.服务器模块使用双端链表来保存多个客户端; 3.订 阅读详情

链表这种数据结构相信大家也不陌生,有很多类型,比如单向链表,双向链表,循环链表等,链表相对于数组来说,一是不需要连续的内存块地址,二是删除和插入的时间复杂度是 O(1) 级别的,非常的高效,但比不上数组的随机访问查询方式。

一样的那句话,没有最好的数据结构,只有恰到好处的数据结构,比如我们后面要介绍的更高层次的数据结构,字典,它的底层其实就依赖的链表规避哈希冲突,具体的我们后面再说。

redis 中借助 C 语言实现了一个双向链表结构:

struct listNode{
    // 前一个节点的指针
    struct listNode *prev;
    // 后一个节点的指针
    struct listNode *next;
    // 节点值
    void *value;
};

prev 指针指向前一个节点,next 指针指向后一个节点,value 指向当前节点对应的数据对象。我盗一张图描述整个串联起来的链表结构:
在这里插入图片描述

虽然我通过链表的第一个头节点就可以遍历整个链表,但在 redis 向上封装了一层结构,专门用于表示一个链表结构:
在这里插入图片描述

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

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

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

Redis链表的特性和优点:

由于是双向链表,具有前后节点的指针引用,所以对获取这两个节点的时间复杂度为O(1)。
通过链表长度len属性,获取长度的时间复杂度为O(1) 。
由于节点值是一个指针,所以value可以指定任何类型。
头节点的前指针和尾结点的后指针都为NULL,是无环的

安路科技FPSoC开发实战:从芯片特性到边缘计算应用 本文深入解析安路科技FPSoC芯片在边缘计算领域的开发实战,重点介绍SALDRAGON系列芯片的异构计算架构优势,包括RISC-V/ARM处理器与FPGA的协同工作。通过工业控制和智能视觉应用案例,展示硬件加速实现与低功耗设计技巧,帮助开发者高效利用FPSoC进行边缘计算应用开发。 阅读详情

相关推荐

ENVI 5.3与IDL 8.5安装指南:从下载到激活的完整流程

本文提供了一份详细的ENVI 5.3与IDL 8.5安装教程,涵盖从获取安装包、运行主程序、安装许可证到关键文件替换的完整流程。指南重点解决了激活过程中的常见问题,并分享了个人实践经验,旨在帮助用户,特别是遥感图像处理初学者,一次性顺利完成软件部署,为后续的科研与开发工作奠定基础。

weixin_29213827的博客 545

《Redis设计与实现》_第三章_遗留问题dup、free、match。

list结构中三个函数的含义 在list结构中有三个函数,在阅读时我并没有理解。 typedef strcut list { listNode *head; listNode *tail; unsigned long len; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr,void *key); }list; void *(*dup)(void *ptr); 这是一个返回值为void ,参数为

JackMaOf996的博客 1187

用Django框架+爬虫技术实现自动获取可画(Canva)团队会员资格的方法

可画(canva)是一个非常流行的在线平面设计平台,因为它无需专业训练和技能就可以利用其丰富的资源设计出美观、酷炫的作品,因而它受到了极其广泛的设计专业和非专业人群的喜爱本文介绍了一种方法,它采用Django网络框架与爬虫技术相结合,实时监控定时更新可画团队版免费邀请链接的网站页面,一旦链接有更新动作,第一时间获取相关信息,并直接加载这个有效的邀请链接,自动进入可画网站获得团队版使用资格。

hhyyqq的博客 2208

Redis底层数据结构-双向链表

链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布与订阅, 慢查询, 监视器, 等等。每个链表节点由一个 listNode 结构来表示, 每个节点都有一个指向前置节点和后置节点的指针, 所以 Redis 的链表实现是双端链表。每个链表使用一个 list 结构来表示, 这个结构带有表头节点指针、表尾节点指针、以及链表长度等信息。因为链表表头节点的前置节点和表尾节点的后置节点都指向 NULL , 所以 Redis 的链表实现是无环链表。

Sajor的博客 1070

RocketMQ源码分析之消息轨迹

文章目录前言一、消息轨迹二、消息轨迹源码分析1、producer端2、consumer端三、消息轨迹中存储的信息1.TraceContext2.TraceBean3.TraceType四、总结 前言   本篇文章将会从以下方面介绍消息轨迹:什么是消息轨迹?如何启用消息轨迹?示例demo、消息轨迹的源码分析和消息轨迹中存储的信息。最后会用一张图来总结消息轨迹的工作原理。 一、消息轨迹 1.什么是消息轨迹? 消息轨迹是用来跟踪记录消息发送、消息消费的轨迹。 2.如何启用消息轨迹? broker端 需要在b

不爱学习的小妞博客 1076

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1918

详解Redis对象的底层数据结构 — 链表

链表的实现是一个双端(具有头尾指针)、无环(头节点的头指针指向null,尾节点的尾指针指向null)、o(1)复杂度获取尾指针(便于从后往前遍历)、o(1)复杂度获取存储多少值(len属性记录大小)、多态(值由 void* 指针指向)链表则是由一个指向头节点的指针,一个指向尾节点的指针,包含所存储长度字段,以及节点值复制函数,节点值释放函数,节点值比较函数。节点包含一个指向前一个节点的指针,和一个指向后一个节点的指针,以及一个指向值的指针,因为是一个指针所以可以指向任意类型值。

qq_64481183的博客 286

SAP S4 HANA 新资产会计中的平行分类账估值

在资产会计中,我们可以设置使用折旧区域的平行分类账会计 我们需要根据涉及的会计原则定义折旧区域,在我们的方案中,公司 FR01 是一家国际集团的当地分支机构,公司 FR01 需要按照集团会计准则 IFRS 和当地 GAAP 会计准则报告财务报表。过账到 LG 会计原则(分类帐 2L)-->分类账 2L的 150 欧元损失 -->在 IFRS 折旧区域,我们有 100 欧元的收益,在 LG 折旧区域,我们有 150 欧元的损失,使用平行分类账 0L 和 2L,我们能够根据不同的会计原则进行平行估值。

yanzibing99的博客 1328

Redis底层之链表

Redis底层之链表Redis底层链表节点使用listNode来实现。每个listNode节点包含三个成员,一个prev指针指向前一个listNode,一个next指针指向下一个节点。一个value指针指向任何类型的值。多个listNode通过prev和next指针组成双端链表。通过一个list比较方便地来管理产生的listNode链表。list结构为链表提供了表头指针head,表尾指针tail,...

Dazhu233的博客 741

【BlueZ】编译产物详解:可执行文件/库文件/工具的生成路径与用途

BlueZ二次开发编译产物机制解析 摘要:在BlueZ蓝牙协议栈二次开发中,90%的报错源于对编译产物类型和路径的混淆。本文系统剖析BlueZ的三阶段编译机制:1)配置阶段生成Makefile;2)编译阶段在.libs目录下产生临时库和可执行文件(不可直接运行);3)安装阶段将产物部署到系统标准路径。重点解析守护进程、命令行工具、动态库的核心路径差异,并针对五大高频问题(如临时库运行崩溃、动态库不匹配、系统覆盖等)给出解决方案。

byte轻骑兵的技术小窝 1万+

图神经网络实战(25)——基于A3T-GCN预测交通流量

本节重点讨论了使用 TGNN 进行交通预测任务。首先,我们介绍了 PeMS-M 数据集,并将其从表格数据转换为具有时间信号的静态图数据集。在实践中,我们根据输入距离矩阵创建了加权邻接矩阵,并将交通速度转换为时间序列。最后,我们构建了 A3T-GCN 模型,这是一个专为交通预测设计的 T-GNN 模型,并将结果与两个基线模型进行了比较,验证了模型的预测结果。

盼小辉丶的博客 8578

Redis底层数据结构之链表

Redis底层数据结构之链表一、Redis中链表的实现我们都知道在列表的插入与删除的操作,如果数组的中间插入一个元素,那么这个元素后的所有元素的内存地址都要往后移动。删除的话同理,只有对数据的最后一个元素进行插入删除操作时,才比较快。链表并不需要更改节点的内存地址,链表的优势在于增和删,查找时间复杂度为O(n),链表的扩展性比数组好。链表作为一种重要的数据结构广泛用于实现redis的各种功能,由于在

daide2012的博客 939

EMD-LSTM时序预测 | MATLAB实现基于EMD-LSTM时间序列预测(EMD分解结合LSTM长短期记忆神经网络)

EMD-LSTM时序预测 | MATLAB实现基于EMD-LSTM时间序列预测(EMD分解结合LSTM长短期记忆神经网络)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 657

Redis-底层数据结构-双端链表

双端链表 链表节点(listNode)的结构 typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; }listNode 链表(list)的结构 typedef struct list{ // 表头节点 listNode *head; // 表尾节点 listNode *tail; // 链表所包含的节点数量 unsign

shiwentong的博客 217

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Redis系列(二)底层数据结构之双端链表

前言 定义 优劣 双向链表 无环链表 带有头指针和尾指针 带有长度计数器 总结 参考文章 联系我 前言 Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢? 我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。 本文将介绍 Redis 中最基础的 linkedlist(双端链...

呼延十 551

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

redis数据结构 双端链表 用于list键底层实现 总结

1.概念 redis列表类型(list)可以存储一个有序的对象列表,底层使用双端链表实现。 2.链表节点结构 typedef struct listNode{ struct listNode *prev; struct listNode *next; void *value; }listNode; 由链表节点可以看出,该链表是双向的 2.链表结构 typedef struct list { listNode *head; listNode *tail; unsigned long len; void *(

weixin_45754452的博客 387

2.Redis内部数据结构-双端链表

       链表作为数组之外的一种常用序列抽象, 是大多数高级语言的基本数据类型;       但是C语言本身不提供链表类型, 大部分C程序都会自己去实现链表类型, Redis也不例外(实现了一个双端链表结构);双端链表的应用       双端链表作为一种通用的数据结构, 在Redis内部使用得非常多: 既是Redis列表结构的底层实现之一, 同时为大量Redis 模块所用, 用于构建Redis...

写后端的小学生 2984

设某链表中最常用的操作是在链表的尾部_Redis系列(二)底层数据结构之双端链表...

前言定义优劣双向链表无环链表带有头指针和尾指针带有长度计数器总结参考文章联系我前言Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对它究竟了解有多深刻呢?我读了几本 Redis 相关的书籍,尝试去了解它的具体实现,将一些底层的数据结构及实现原理记录下来。本文将介绍 Redis 中最基础的 linkedlist(双端链表) 的实现方法。它是 Redis ...

weixin_39603505的博客 151

Redis设计与实现之双端链表

但是大多数情况下,数据的丢失概率非常低。举个例子:当删除一个 listNode 时,如果包含这个节点的 list 的 list->free 函数不为空, 那么删除函数就会先调用 list->free(listNode->value) 清空节点的值,再执行余下的删除 操作(比如说,释放节点)。双端链表作为一种常见的数据结构,在大部分的数据结构或者算法书里都有讲解,因此,这一 章关注的是 Redis 双端链表的具体实现,以及该实现的 API ,而对于双端链表本身,以及双端 链表所对应的算法,则不做任何解释。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 2028

redis的基本数据结构

压缩列表、双端链表、跳跃表、字典

sffSswww的博客 164

Redis数据结构与对象底层相关知识总结

Redis数据结构相关知识总结什么是RedisRedis的value类型简介底层数据结构一:简单动态字符串(SDS)底层数据结构二:双端链表底层数据结构三:字典底层数据结构四:跳跃表底层数据结构五:整数集合底层数据结构六:压缩列表底层数据结构和上层Value五种类型的对应关系 之前看到经常讨论Redis如何如何,自己完全没听说过这个东西,觉得还是有必要学习以下,就找了一些视频和学习资料开始学习,其...

qq_43479540的博客 469

最详细的Redis底层数据结构全面详解

因此Redis构建了一种新的字符串结构,称为(Simple DynamicString),简称那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含jack”的SDS。

Gaomengsuanjia_的博客 2719

redis结构

Redis 实现了自己的双端链表结构。 双端链表主要有两个作用: 作为 Redis 列表类型的底层实现之一; 作为通用数据结构,被其他功能模块所使用; 双端链表及其节点的性能特性如下: 节点带有前驱和后继指针,访问前驱节点和后继节点的复杂度为 O(1) ,并且对链表的迭代可以在从表头到表尾和从表尾到表头两个方向进行; 链表带有指向表头和表尾的指针,因此对表头和表尾进行处理的复杂度为 O(1) ; ...

weixin_42849517的博客 2万+

Redis底层数据结构之快链表(QuickList)

本文介绍了Redis中的QuickList数据结构。QuickList是一种结合了双向链表和ZipList的混合结构,每个链表节点存储一个ZipList。

zErO__N的博客 1285

keil obj 文件 结构_Redis中的底层数据结构

微信公众号:carefulbold关注可了解更多的教程及排版技巧。问题或建议,请公众号留言;点关注不迷路.redis的底层数据类型String类型:由于C语言中并不存在String数据类型,因此,redis自己创建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示.打开sds.h文件可查看其对应的数据结构信息...

weixin_30914751的博客 305

【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构

【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构

2022年毕业的萌新程序猿,输出一下自己的学习内容~ 680

Redis链表

链表链表链表 & 链表节点总结 链表 Redis中的链表在不同情况下底层实现的数据结构是不同的,当列表的元素比较多或者列表中的元素都是比较长的字符串时,Redis就会用链表作为列表的底层实现。 链表 & 链表节点 链表节点 数据结构: // 链表节点 class listNode{ //前置节点 listNode pre; //后置节点 lis...

sunpeiv的博客 282
上一篇: Redis底层数据结构之字符串的SDS
下一篇: 开发时怎么用好 Git 分支?
苦艾酒丶
博客等级 码龄9年 41粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值