首页 > 数据库 >Redis数据结构3:REDIS_LISTNODE

Redis数据结构3:REDIS_LISTNODE

时间:2023-12-10 16:03:03浏览次数:47  
标签:LISTNODE REDIS void Redis 链表 list listNode 数据结构 节点

REDIS_LISTNODE

REDIS_LISTNODE本质上与Java的LinkedList一致,NodeList即为链表,是基本的线性结构。C语言原生没有对链表的支持,Redis对链表进行了实现。

listNode

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

listNode的结构较为简单,本质上只有三部分:prev(前节点)nex(后节点)value(值)

其中前后节点分别为一个新的listNode。

4.png

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是对listNode的一个封装。提供了链表头指针head、链表尾节点tail、链表节点数量len、以及可以自定义实现的 dup、free、match 函数。

5.png

REDIS_LISTNODE的优势与缺陷

优势

  • listNode中有两个指向前后节点的指针,这意味着listNode不需要连续的内存空间
  • listNode中用len存储了链表长度,这样获取链表长度的时间复杂度为O(1)
  • listNode 链表节使用void*指针保存节点值,并且可以通过 list 结构的dupfreematch函数指针为节点设置该节点类型特定的函数,因此链表节点可以保存各种不同类型的值

缺点

  • 链表每个节点之间的内存都是不连续的,导致其无法很好利用 CPU 缓存。能很好利用 CPU 缓存的数据结构就是数组,因为数组的内存是连续的,这样就可以充分利用 CPU 缓存来加速访问。
  • 保存一个链表节点的值都需要一个链表节点结构头的分配,内存开销较大。数组只需要下标访问即可。

正因如此,Redis 3.0 的 List 对象在数据量比较少的情况下,会采用「zipList」作为底层数据结构的实现,它的优势是节省内存空间,并且是内存紧凑型的数据结构。

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

标签:LISTNODE,REDIS,void,Redis,链表,list,listNode,数据结构,节点
From: https://blog.51cto.com/ErickRen/8761476

相关文章

  • Redis哨兵
    是什么吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转为新主库,继续对外服务能干嘛主从监控:监控主从Redis库运行是否正常消息通知:哨兵可以将故障转移的结果发送给客户端故障转移:如果Master异常,则会进行主从切换,将其中一个Slave作为新Mas......
  • Redis的数据类型以及使用场景,看这一篇就够啦
    Redis的数据类型以及使用场景,看这一篇就够啦原创2021-06-2018:02·猿视野Redis数据类型stringStringhashHashMaplistLinkedListsetHashSetsorted_setTreeSetredis数据存储格式redis自身是一个Map,其中所有的数据都是采用key:value的形式存储数据类型指......
  • Redis和Springboot在Windows上面设置开机启动的方法
    Redis和Springboot在Windows上面设置开机启动的方法背景同事遇到一个问题Windows晚上自动更新服务然后第二天Springboot开发的程序没有启动起来.所以基于此想创建一个开机启动的服务设置很早之前自己研究过Winsw等工具但是感觉对springboot比较复杂的应用使用起来比......
  • Redis复制
    是什么主从复制,master以写为主,slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其他slave数据库能干嘛读写分离容灾恢复数据备份水平扩容支撑高并发怎么玩master如果配置了requirepass参数,需要密码登录,那么slave就要配置masterauth来设置校验......
  • Redis7 发布订阅
    1、是什么是一种通信模式:发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流2、能干啥Redis客户端可以订阅任意数量的频道,类似于微信关注多个公众号当有新消息通过PUBLISH命令发送给频......
  • 基于Redis的简易延时队列
    基于Redis的简易延时队列一、背景在实际的业务场景中,经常会遇到需要延时处理的业务,比如订单超时未支付,需要取消订单,或者是用户注册后,需要在一段时间内激活账号,否则账号失效等等。这些业务场景都可以通过延时队列来实现。最近在实际业务当中就遇到了这样的一个场景,需要实现一个......
  • centos7.9 编译安装redis 6.2.6
    参考地址:https://zhudo.net/server/linux/149.html 1.下载和安装下载redis需要其他版本去官网自行下载wget-chttps://download.redis.io/releases/redis-6.2.6.tar.gz//解压tar-zvxfredis-6.2.6.tar.gz//把安装包移动到安装目录,并且重命名为redismvredis-6.2.6......
  • Redis数据结构2:REDIS_STRING(SDS)
    REDIS_STRING(SDS)SDS全称SimpleDynamicString(简单动态字符串),是专为Redis设计的简易字符串实现。Redis并未采用C语言传统字符串char*,而是自己设计了一套字符串实现标准。传统字符串的缺陷C语言字符串实际上就是一个以'\0'结尾的字符数组。例如:char*myName="ErickRen";......
  • Redis学习记录第七天
        今天我们继续深入学习Redis,探讨了Redis的数据结构类型以及一些高级功能。首先,我们先来回顾一下Redis支持的数据结构类型:String(字符串):最基本的数据结构类型,可以存储字符串、数字等数据。Hash(哈希):键值对的集合,可以用于存储对象,支持添加、删除、获取单个或多个键值对。Lis......
  • 常见场景题-Redis的bitmap如何实现签到功能?
    Redis的bitmap实现签到系统?答:主要讲一下Redis原生的bitmap的使用方法,以及如何使用bitmap来实现签到功能先来看一下如何使用redisbitmap的原生命令实现签到功能:签到我们先来设计key:userid:yyyyMM,那么假如usera在2023年10月3日和2023年10月4日签到的话,使用以下命令:se......