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

【redis 第八篇章】链表结构

一、数组和链表

1、数组

数组会在内存中开辟一块连续的空间存储数据,这种存储方式有利也有弊端。当获取数据的时候,直接通过下标值就可以获取到对应的元素,时间复杂度为 O(1)。但是如果新增或者删除数据会移动大量的数据,时间复杂度为 O(n)。数组的扩容机制是:如果数组空间不足,会先开辟一块新的空间地址,将原来的数组复制到新的数组中。

2、链表

链表不需要开辟连续的内存空间,其通过指针将所有的数据连接起来。新增或者删除的时候只需要将指针指向的地址修改就行了,时间复杂度为 O(1)。但是查询的时间复杂度为 O(n)

二、链表

1、双向链表

在这里插入图片描述

双向链表是各个节点之间的逻辑关系是双向的。
双向链表中节点的组成是:prior: 指向当前节点的前置节点,data:当前节点存储的数据。next:指向当前节点的后置节点。

2、压缩链表

  • 压缩链表是为了节约内存开发的。
  • ziplist是一个特别的双向链表,没有维护双向指针prev next;反而是存储上一个entry的长度和当前entry长度,通过长度推算出下一个元素在什么地方。
  • 牺牲读取的性能,获得高效的存储空间,因为存储指针比存储entry长度更费内存,这就是典型的时间换空间。

3、quicklist链表

  • 官网介绍:
    A doubly linked list of ziplistsA generic doubly linked quicklist implementation
  • 介绍:
    quicklist是一个双向链表,并且是一个ziplist的双向链表,ziplist本身是一个维持数据项先后顺序的列表,而且数据项保存在一个连续的内存块种。

三、对比

1、双向链表

  • 双端链表便于在表的两端进行push和pop操作,但是它的内存开销比较大。
  • 双端链表每个节点上除了要保存的数据之外,还要额外保存两个指针。
  • 双端链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片。

2、压缩列表

  • ziplist由于是一块连续的内存,所以存储效率很高。
  • ziplist不利于修改操作,每次数据变动都会引发一次内存的realloc。
  • 当ziplist长度很长的时候,一次realloc可能会导致大批量的数据拷贝,进一步降低性能。

3、quicklist链表

  • 空间效率和时间效率的折中。
  • 结合了双端链表和压缩列表的优点。

四、总结

redis 3.2 版本之前使用的是 双向链表和压缩链表 两种,因为双向链表占用的内存要比压缩链表高,所以创建链表时首先会创建 压缩链表,在合适的时机会转化成双向链表redis 3.2 之后使用的是 quicklist链表

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新增道路查询后的最短距离
  • YOLOv8添加注意力模块并测试和训练
  • 【VS Code】launch.json与tasks.json
  • Java 并发编程:volatile 关键字介绍与使用
  • 【系统架构设计师】二十四、安全架构设计理论与实践④
  • 安装ubuntu server24.04系统
  • 浅谈 Spring AOP框架 (1)
  • 数据湖之Hudi
  • Java 技巧:将整数每一位数字转换为数组
  • 【C++题解】1015. 鸡兔同笼问题
  • ABAQUS基于CT断层扫描的三维圆柱体多孔结构建模
  • 【LabVIEW学习篇 - 12】:通知器
  • 数据挖掘可以挖掘什么类型的模式?
  • ReentrantLock源码分析
  • QChart曲线绘制-1.普通曲线
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CSS实用技巧
  • ES学习笔记(12)--Symbol
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Mysql5.6主从复制
  • Node + FFmpeg 实现Canvas动画导出视频
  • select2 取值 遍历 设置默认值
  • Shell编程
  • 技术:超级实用的电脑小技巧
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 经典排序算法及其 Java 实现
  • 面试总结JavaScript篇
  • 普通函数和构造函数的区别
  • 设计模式 开闭原则
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 网页视频流m3u8/ts视频下载
  • 小程序开发中的那些坑
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 阿里云重庆大学大数据训练营落地分享
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 进程与线程(三)——进程/线程间通信
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​虚拟化系列介绍(十)
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • !$boo在php中什么意思,php前戏
  • # SpringBoot 如何让指定的Bean先加载
  • # 透过事物看本质的能力怎么培养?
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $.ajax()方法详解
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)虚拟机的安装与使用,linux系统安装
  • (2022 CVPR) Unbiased Teacher v2
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (ZT)薛涌:谈贫说富
  • (代码示例)使用setTimeout来延迟加载JS脚本文件