首页 > 数据库 >12- Redis 中的 链表 数据结构

12- Redis 中的 链表 数据结构

时间:2024-06-04 18:33:35浏览次数:24  
标签:12 listNode void Redis 链表 数据结构 节点

Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构,所以 Redis 自己设计了一个链表数据结构。

1. 链表节点结构设计

先来看看【链表节点】结构的样子:

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

有前直节点和后置节点,可以看得出,这是一个双向链表。

2. 链表结构设计

不过,Redis 在 listNode 结构体基础上又封装了 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 以及可以自定义实现的 dup、free、match 函数。

举个例子,下面是由 list 结构和 3 个 listNode 结构组成的链表:

3. 链表的优势与缺陷

Redis 的链表实现优点如下:

  • listNode 链表节点的结构里带有 prev 和 next 指针,获取某个节点的前置节点或后置节点的时间复杂度只需 O(1),而且这两个指针都可以指向 NULL,所以链表是无环链表

  • list 结构因为提供了表头指针 head 和 表尾节点 tail,所以获取链表的表头节点和表尾节点的时间复杂度只需 O(1)

  • list 结构因为提供了链表节点数量 len,所以获取链表中的节点数量的时间复杂度只需 O(1)

  • listNode 链表节使用 void* 指针保存节点值,并且可以通过 list 结构的 dup、free、match 函数指针为节点设置该节点类型特定的函数,因此链表节点可以保存各种不同类型的值

链表的缺陷也是有的:

  • 链表每个节点之间的内存都是不连续的,意味着无法很好的利用 CPU 缓存。能很好利用 CPU 缓存的数据结构就是数组,因为数组的内存是连续的,这样就可以充分利用 CPU 缓存来加速访问。

  • 还有一点,保存一个链表节点的值都需要一个链表节点结构头的分配,内存开销较大

因此,Redis 3.0 的 List 对象在数据量比较少的情况下,会采用【压缩列表】作为底层数据结构的实现,它的优势就是节省内存空间,并且是内存紧凑型的数据结构。

不过,压缩列表存在性能问题(具体问题后面会说),所以 Redis 在 3.2 版本设计了新的数据结构 quicklist,并将 List 对象的底层数据结构改由 quicklist 实现。

然后在 Redis 5.0 设计了新的数据结构 listpack,沿用了压缩列表紧凑型的内存布局,最终在最新的 Redis 版本,将 Hash 对象和 Zset 对象的底层数据结构实现之一的压缩列表,替换成由 listpack 实现。

标签:12,listNode,void,Redis,链表,数据结构,节点
From: https://blog.csdn.net/YoungSoulwt/article/details/139435914

相关文章

  • CentOS-7.9 安装redis7.0.5步骤
     下载Redis7.0.5的源代码wgethttp://download.redis.io/releases/redis-7.0.5.tar.gz解压并进入源代码目录tarzxfredis-7.0.5.tar.gzcdredis-7.0.5编译和安装,并指定安装目录,并复制Redis配置文件makesudomakePREFIX=/usr/local/redisinstallcpredis.conf......
  • 全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯
     资料下载地址:全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯这是旧版退役拆解了新版 与电路图所示共设置4个按键短按开关台灯加减键调光长按进入菜单1.台灯加入PCAPWM调光STC12C5A60S2的PCAPWM非常好用设置简单无极调节......
  • NCHU-软件学院-232019班-23201125-罗伊鑫-第二次Blog
    前言本次Blog总结三次题目集的7-1题目的知识点、题量、难度等情况,以及写完后的错误总结和自我思考。1.知识点三次题目集都对于类的设计的提前规划好有着必要的需求,还有就是对于继承与多态的合理的使用。接着就是对于正则表达式的使用的检测,然后就是要有清晰的逻辑编程表达。2.......
  • CSRedis用于Redis哨兵模式,NetCore
    十年河东,十年河西,莫欺少年穷学无止境,精益求精上一节通过两台windowsServer服务器部署了Redis的哨兵模式,详情参考:两台windowserver服务器配置Redis哨兵集群----一主二从redis通过主从复制来实现高可用,但是发生故障时需要人工进行主从切换,效率低下。哨兵机制实现了redis主从的自......
  • Conts7 安装Redis教程
    1.添加软件安装源yuminstalleple-release2.安装Redisyuminstallredis-y3.启动redissystemctlstartredis4.允许开机启动systemctlenableredis5.修改redis配置文件vim/ect/redis.conf修改2处文件(虚拟机)6.重启redissystemctlrestartredis7.登陆redis数......
  • 【会议征稿,IEEE出版】第二届算法、图像处理与机器视觉国际学术会议(AIPMV2024,7月12-14)
    2024年镇江市计算机科学技术大会暨第二届算法、图像处理与机器视觉国际学术会议(AIPMV2024)将于2024年7月12日-14日在江苏镇江召开。会议主要围绕算法、图像与视觉处理等研究领域展开讨论,为从事算法、图像与视觉处理研究的专家学者、工程技术人员、技术研发人员提供一个分享......
  • redis - [03] 配置&命令
    题记部分 一、配置(Config)  二、命令(Command)(1)启动redis服务:redis-server.exeredis.windows.conf(2)连接redis-server:redis-cli-hhost-pport-apassword(3)查看key是否存在:existsmyKey(4)查看key的值:getmyKey(5)序列化给定key,返回序列化的值(不会改变key的值):dumpmy......
  • Redis之set
    SetRedis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。(无序不重复)集合对象的编码可以是intset或者hashtable。Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。案例127.0.0.1:6379>SADDmysethe......
  • 学习笔记12:图像数据增强及学习速率衰减
    转自:https://www.cnblogs.com/miraclepbc/p/14360231.html数据增强常用数据增强方法:transforms.RandomCrop#随机位置裁剪transforms.CenterCrop#中心位置裁剪transforms.RandomHorizontalFlip(p=1)#随机水平翻转transforms.RandomVerticalFlip(p=1)#随机上下......
  • 《信息学奥赛一本通 编程启蒙C++版》3126-3130(5题)
    3126:练21.3 神奇装置信息学奥赛一本通-编程启蒙(C++版)在线评测系统练21.3神奇装置信息学奥赛一本通-编程启蒙(C++版)在线评测系统3126:练21.3神奇装置_哔哩哔哩_bilibili#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b,c,d; cin>>a>>b>>c......