当前位置: 首页 > ds >正文

【Redis】双向链表结构

目录

  • 1、背景
  • 2、双向链表
    • 【1】底层结构
    • 【2】特性
    • 【3】优缺点

1、背景

redis的list类型在旧版本数据量小的时候用的压缩列表,数据量大的时候用双向链表,新版本使用快速列表,接下来就来讲一下redis(6.2.18版本)双向链表的底层结构。

2、双向链表

【1】底层结构

双向链表的每一个节点底层结构如下:

typedef struct listNode {struct listNode *prev; //指向上一个链表节点struct listNode *next; //指向下一个链表节点void *value; //节点的值
} listNode;

多个节点组成一个链表的底层结构如下:

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;

【2】特性

双向链表的特性如下:

特性实现方式
双向遍历每个listNode包含prev和next指针,支持前后向遍历
无环链表头节点的prev和尾结点的next均为NULL
长度缓存list.len直接记录节点数,无需遍历(O(1)时间复杂度)
多态支持通过dup、free、match函数指针,支持任意类型的值(如字符串、整数等)

【3】优缺点

双向链表的优缺点如下:

特性优点缺点
时间复杂度头部/尾部插入、删除:O(1)长度获取随机访问:O(n)需遍历节点
内存占用支持动态扩容,无需连续内存每个节点需存储prev和next指针
功能灵活性支持双向遍历,可存储任意类型数据无内置压缩机制,存储小数据时内存利用率低
实现复杂度结构简单,易于维护和扩展大量小节点内存碎片化风险
适用场景频繁头部/尾部操作(如LPUSH、RPOP)存储大量小数据时不如ziplist节省内存
http://www.xdnf.cn/news/6485.html

相关文章:

  • ARM A64 LDR指令
  • constexpr 关键字的意义(入门)
  • 关于在深度聚类中Representation Collapse现象
  • RM算法的地下宫殿
  • 解决 Conda 安装 PyTorch 1.1.0 报错:excluded by strict repo priority(附三种解决方案)
  • 射击游戏demo11
  • 微服务如何实现服务的高并发
  • idea整合maven环境配置
  • 幼儿学前教育答辩词答辩技巧问题答辩自述稿
  • IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖
  • MapReduce架构-打包运行
  • gitlab+portainer 实现Ruoyi Vue后端CI/CD
  • Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验
  • 全面掌握JSR303校验:从入门到实战
  • 安全牛报告解读《低空经济发展白皮书(3.0)安全体系》
  • React事件机制
  • antd mobile 点击 TabBar 切换页面
  • 工业4.0神经嫁接术:ethernet ip转profinet协议通信步骤图解
  • 【数据挖掘笔记】兴趣度度量Interest of an association rule
  • AI大模型学习二十四、实践QEMU-KVM 虚拟化:ubuntu server 25.04 下云镜像创建Ubuntu 虚拟机
  • [6-8] 编码器接口测速 江协科技学习笔记(7个知识点)
  • ES常识8:ES8.X如何实现热词统计
  • 微服务概述
  • 量子隧穿:PROFINET到Ethernet ip的无损耗协议转换方案转
  • 【寻找Linux的奥秘】第五章:认识进程
  • salesforce如何导出所有字段
  • SQL注入---05--跨站注入
  • 解决Mongoose “Cannot overwrite model once compiled“ 错误的完整指南
  • pytest多种断言类型封装为自动化断言规则库
  • 宝元LNC数控数据采集方式、跨平台采集通讯方案介绍