Redis数据结构——压缩列表ziplist

news2024/11/26 2:47:33

定义

压缩列表ziplist是Redis中列表和哈希键的底层实现方式之一。
当一个列表只包含少量列表项,并且每个列表项要么是小整数值,要么是较短的字符串时,那么Redis就会使用压缩列表来作为列表的底层实现。
另外,当一个哈希表中只包含少量键值对时,并且每个每个键值对的键key和值value要么是小整数值,要么是短的字符串时,也会使用压缩列表作为实现方式

压缩列表是Redis为了节约内存而设计的,由一系列特殊编码的连续内存组成的顺序型的数据结构,一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。
压缩列表类似于数组,在内存中是连续的,每个节点用来存储数组,不过有一点不同是,压缩列表允许每个节点的空间大小是可以不相同。

数组在内存中的分布是:

压缩列表可以看做是对数组的压缩,压缩列表在内存中的结构是这样的:

压缩列表节点

压缩列表中的节点才是真正存储数据的,但是压缩列表不是数组,数组中每个元素占用的空间大小是固定的,因为可以随机访问;但是压缩列表中每个节点的大小是不固定的,怎么才能知道从哪到哪是一个节点的内容呢?
这就需要看节点的内存结构的设计了,每个节点可以保存一个字节数组或者一个整数值
其中字节数组的长度可以是以下三种长度之一:

  • 长度小于等于63(2^6 - 1)字节的字节数组
  • 长度小于等于16383(2^14 - 1)字节的字节数组
  • 长度小于等于(2^32 - 1)字节的字节数组
    而整数值可以是:
  • 4位长的无符号整数
  • 1字节、3字节、4字节、8字节的整数
    压缩列表节点的内存结构是:

    previous_entry_length记录了前一个节点的长度,通过这个属性,我们根据当前节点的起始地址就能计算出前一个节点的起始地址,从而就可以遍历整个压缩列表,压缩列表的遍历是从表尾到表头,就是基于这一个原理实现的。
  • 如果前一个节点的长度小于等于254字节,那么previous_entry_length属性占用1字节就可以。
  • 如果前一个字节的长度大于254字节,那么previous_entry_length需要用5字节来保存前一个节点的长度。
    encoding属性记录了节点内容content属性所保存的数据类型以及长度,具体的数据类型及长度,了解即可。
    content保存中真实的数据内容。

连锁更新

考虑这样一种特殊情况:有一个压缩列表,每个节点的大小都是在250~254之间,因此节点记录的上一个节点的长度是小于254字节的,所以previous_entry_length只需要一个字节就能记录,但是当在此节点前插入一个大于254字节的节点时,麻烦就要产生了,因为此时当前节点来说,一个字节无法记录前驱节点的长度,需要5字节才可以。此时当前节点就要发生扩容操作,同时后续的节点的previous_entry_length也要发生变化,由于在内存中每个节点是连续的,所以后续的每个节点都要重新分配空间。
当在列表内部或头部,插入或删除一个节点时,可能会影响到后续节点的空间大小,同时还需要将后续的每个节点重新分配空间。此时,程序会从受影响的这个节点开始,为这个节点扩容,然后继续下一个节点,逐个扩容,直到最后一个节点为止。
这种在特殊情况下产生的连续多次空间扩展操作称之为“连锁更新”。
连锁更新在最坏的情况下的时间复杂度是O(N),连锁更新十分损耗性能。

  • 在一般情况下,不会发生连锁更新
  • 其次,即使出现了连锁更新,只要被更新的节点数量不多,也不会性能造成影响

参考文章

  • 《Redis设计与实现》
  • Redis数据结构——压缩列表 - 随心所于 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA + WS2812采灯控制

文章目录 一、WS2812C-2020-V11、产品概述2、引出端排列及功能3、数据传输时间4、数据传输方法 二、使用WS2812C显示图片1、静态显示2、动态显示 一、WS2812C-2020-V1 1、产品概述 WS2812C-2020-V1是一个集控制电路与发光电路于一体的智能外控LED光源;其外型采用最…

Docker中Tomcat部署步骤

第一次访问没有东西。

2023牛客暑期多校训练营9 I.Non-Puzzle: Segment Pair(tag:差分)

文章目录 题目大意题解参考代码 题目大意 1 ≤ n , l i , r i ≤ 5 ∗ 1 0 5 1 \leq n,l_i,r_i \leq 5*10 ^5 1≤n,li​,ri​≤5∗105 题解 这题 l / r l/ r l/r 的数据在 5 1 0 5 5\times 10^5 5105 ,想到差分。 特殊的是它有两条线段,对于同一个点…

Photoshop窗口->排列菜单下进行匹配缩放/位置/旋转

首先,在Photoshop中打开4张以上图片,并选择“窗口”->“排列”->"四联": 将鼠标移动至其中一张图片中,按住“Z”键,拖动鼠标,调整图片缩放比例至60.55%, 再选择“窗口”->“…

一篇打通,pytest自动化测试框架详细,从0到1精通实战(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 读取文件 1、读取…

Python中使用隧道爬虫ip提升数据爬取效率

作为专业爬虫程序员,我们经常面临需要爬取大量数据的任务。然而,有些网站可能会对频繁的请求进行限制,这就需要我们使用隧道爬虫ip来绕过这些限制,提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技…

Grounding DINO:根据文字提示检测任意目标

文章目录 1. 背景介绍2. 方法创新2.1 Feature Extraction and Enhancer2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-Sentence Level Text Feature2.5 Loss Function3. 实验结果3.1 Zero-Shot Transfer of Grounding DINO3.2 Referring Object Detec…

多线程并发服务器

代码&#xff1a; #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 6666 //1024~49151 #define IP "192.168.122.130" //ifconfig查看本机IP #include <pthread.h> //…

urllib与数据解析

urllib爬取数据 import urllib.request as request# 定义url url "https://www.baidu.com" #模拟浏览器发起请求获取响应对象 response request.urlopen(url)""" read方法返回的是字节形式的二进制数据 二进制--》字符串 解码 decode( 编码的格式…

CSDN编程题-每日一练(2023-08-14)

CSDN编程题-每日一练&#xff08;2023-08-14&#xff09; 一、题目名称&#xff1a;小股炒股二、题目名称&#xff1a;王子闯闸门三、题目名称&#xff1a;圆小艺 一、题目名称&#xff1a;小股炒股 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …

一文带你拿下基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 1.Selenium IDE&#xff1a;Fir…

Amazon EMR Hudi 性能调优——Clustering

随着数据体量的日益增长&#xff0c;人们对 Hudi 的查询性能也提出更多要求&#xff0c;除了 Parquet 存储格式本来的性能优势之外&#xff0c;还希望 Hudi 能够提供更多的性能优化的技术途径&#xff0c;尤其当对 Hudi 表进行高并发的写入&#xff0c;产生了大量的小文件之后&…

CentOS查看磁盘IO

CentOS查看磁盘IO 使用iotop命令&#xff08;top命令对应&#xff09; sudo iotop该命令将实时显示磁盘IO活动&#xff0c;按IO使用率排序&#xff0c;并显示每个进程的IO信息。 使用iostat命令&#xff1a; iostat -dx该命令将显示磁盘IO统计信息&#xff0c;包括每个设备…

【Windows 11】安装 Android子系统 和 Linux子系统

本文使用电脑系统&#xff1a; 文章目录 一、安卓子系统1.1 安装 WSA1.2 使用 二、Linux子系统2.1 安装 WSL 以及WSL 相关概念2.2 安装一个Linux发行版2.21 从Microsoft Store 安装2.22 用命令安装 2.23 拓展 三、拓展3.1 存储位置3.2 虚拟化技术3.3 Windows 虚拟内存3.3 wsl …

聊聊RedisTemplate的各种序列化器

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录 概述序列化器作用和原理JDK 序列化方式多一点 String 序列化方式JSON 序列化方式 总结源码 概述 在SpringBoot中使用redis基本上都是通过Spring Data Redis&#xff0c;那就不得不说RedisTempl…

大数据--难点--地图的制作

地图一直是亮点也是难点&#xff0c;刚刚进公司的时候也很难懂~~做出来的也很难看 纯CSS3使用vw和vh视口单位实现h5页面自适应&#xff0c;gulp自动监听sass改动并保存到css中 当修改了sass里面的代码后&#xff0c;gulp会自动监听修改内容并同名保存到css文件夹中&#xff0…

MySQL8.xx一主两从复制安装与配置

搭建环境: 查看系统版本cat /etc/redhat-release [rootwww tools]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 查看内核版本cat /proc/version 目标: 一主两从 主机IP 主机名称 端口 搭建环境 安装目录192.168.1.100 docker…

祝金榜题名!64页Python基础学习手册!背完小白变大牛!

Python是一个温柔而强大的编程语言~在学习之初整个人都是小兴奋&#xff0c;学习中途遇到了各种问题但是我们坚持着。从一些基础概念的学习&#xff0c;到变量、函数、模块、流程控制、循环语句等等&#xff0c;Python的基础内容真心丰富呢~ 今天&#xff0c;给大家share一份我…

0142 存储系统2

目录 3.存储系统 3.4外部存储器 3.5高速缓冲存储器 3.6虚拟存储器 部分习题 3.存储系统 3.4外部存储器 3.5高速缓冲存储器 3.6虚拟存储器 部分习题 1.一个磁盘转速为7200转/分&#xff0c;每个磁道有160个扇区&#xff0c;每个扇区有512字节&#xff0c;则在理想情况下&…

九、多态(2)

本章概要 构造器和多态 构造器调用顺序继承和清理构造器内部多态方法的行为 协变返回类型使用继承设计 替代 vs 扩展向下转型与运行时类型信息 构造器和多态 通常&#xff0c;构造器不同于其他类型的方法。在涉及多态时也是如此。尽管构造器不具有多态性&#xff08;事实上…