学习分享-Redis 中的压缩列表 (Ziplist)

Redis 中的压缩列表 (Ziplist)

压缩列表 (Ziplist) 是 Redis 内部用于优化小规模数据存储的一种紧凑数据结构。它设计用于高效地存储包含少量元素的列表、哈希表或有序集合,以减少内存占用和提高性能。以下是压缩列表的详细介绍:

1. 压缩列表的结构

压缩列表是一种连续的内存块,包含多个数据项 (entries)。每个数据项可以是整数或字节数组。整个列表的布局分为以下几个部分:

  • zlbytes:用 4 个字节存储整个压缩列表占用的字节数。这便于在内存中复制或重新分配时知道需要处理的数据长度。
  • zltail:用 4 个字节存储列表中最后一个数据项距离列表起始位置的字节偏移量。这使得从列表尾部向前遍历时更为高效。
  • zllen:用 2 个字节存储列表中的数据项数目。当数据项数目超过 65535 时,zllen 不再准确,仅作为参考。
  • entries:实际的数据项列表,每个数据项按顺序存储在这里。
  • zlend:一个特殊的字节 (0xFF) 标志着压缩列表的结束。
  • 在这里插入图片描述

听到“压缩”两个字,直观的反应就是节省内存。之所以说这种存储结构节省内存,是相较于数组的存储思路而言的。我们知道,数组要求每个元素的大小相同,如果我们要存储不同长度的字符串,那我们就需要用最大长度的字符串大小作为元素的大小(假设是20个字节)。存储小于 20 个字节长度的字符串的时候,便会浪费部分存储空间。

在这里插入图片描述
数组的优势占用一片连续的空间可以很好的利用CPU缓存访问数据。如果我们想要保留这种优势,又想节省存储空间我们可以对数组进行压缩。
在这里插入图片描述
但是这样有一个问题,我们在遍历它的时候由于不知道每个元素的大小是多少,因此也就无法计算出下一个节点的具体位置。这个时候我们可以给每个节点增加一个lenght的属性。
在这里插入图片描述
如此。我们在遍历节点的之后就知道每个节点的长度(占用内存的大小),就可以很容易计算出下一个节点再内存中的位置。这种结构就像一个简单的压缩列表了。

2. 数据项的结构

每个数据项由三个部分组成:

  • 前置长度 (prevlen):记录前一个数据项的长度。这有助于在内存中反向遍历列表。该长度使用 1 或 5 个字节存储,具体取决于前一个数据项的长度。如果前一个数据项的长度小于 254 字节,则使用 1 个字节;否则,使用 5 个字节(前 1 个字节为 254,后 4 个字节存储实际长度)。
  • 数据长度 (encoding):记录当前数据项的长度和类型。这部分使用变长编码 (variable-length encoding) 存储,既可以是整数,也可以是字节数组。根据数据类型,可能使用 1 至 5 个字节。
  • 数据 (content):存储实际的数据内容。
3. 数据项的编码

压缩列表支持多种数据类型的编码,以提高存储效率:

  • 整数编码:对于可以表示为整数的数据项,压缩列表使用特定的编码方式以减少空间。
    • 4 位标识符和 4 位实际值(用于 0 至 12 之间的整数)。
    • 8 位、16 位、24 位、32 位和 64 位整数编码(分别适用于不同范围的整数)。
  • 字节数组编码:对于其他类型的数据项,压缩列表使用变长编码来表示长度(1 至 5 个字节),然后存储实际的字节数据。
4. 操作和效率

压缩列表的设计初衷是高效处理小规模数据,具体操作包括:

  • 插入:在压缩列表中插入一个数据项时,Redis 可能需要调整后续数据项的前置长度字段,导致链式更新。如果新数据项插入到中间位置,尤其是前一个数据项的长度变化较大时,这种更新成本会更高。
  • 删除:删除数据项后,Redis 也可能需要调整相邻数据项的前置长度字段。
  • 查找:由于压缩列表是一个连续的内存块,直接索引查找数据项比链表更高效。遍历也可以在正向和反向都高效进行,尤其是在尾部插入和删除时。
5. 使用场景

压缩列表被 Redis 用于以下场景:

  • 短列表:当列表包含的元素数量较少且每个元素较小时,Redis 使用压缩列表来替代常规的链表。
  • 小哈希表:当哈希表的字段数量较少且字段和值都较小时,压缩列表可以用来替代标准哈希表结构。
  • 有序集合 (Sorted Set):当有序集合包含的元素数量较少时,压缩列表可用来替代跳跃表 (skiplist) 和散列表 (hash table) 的组合。

Redis 对于何时使用压缩列表有特定的配置选项,可以通过调整这些选项来控制其使用阈值。

6. 优缺点
  • 优点
    • 内存占用低:通过紧凑的内存布局和变长编码,压缩列表减少了内存使用。
    • 高效的顺序访问:由于数据存储在连续的内存块中,顺序访问和遍历非常高效。
  • 缺点
    • 插入和删除复杂度高:在中间位置进行插入和删除操作时,可能需要调整多个数据项的前置长度字段,增加了操作成本。
    • 不适合大规模数据:对于大量数据,压缩列表的链式更新会带来显著的性能开销。

参考资料

  • Redis 官方文档:Redis Data Types
  • Redis 源代码:ziplist.c

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac 安装mysql启动报错 ERROR!The server quit without update PID file

发现问题: mac安装mysql初次启动报错: 一般出现这种问题,大多是文件夹权限,或者以前安装mysql卸载不干净导致。首先需要先确定问题出在哪?根据提示我们可以打开mysql的启动目录,查看启动日志。 问题解决&a…

逆变器使用手册:类型详解、安装要点与维护须知

逆变器随着可再生能源的兴起和移动电源需求的激增已成为连接直流电与交流电世界的桥梁,其重要性不言而喻。无论是太阳能发电系统的高效利用,还是汽车、游艇等移动设备的电力供应,逆变器都扮演着关键角色。然而,正确的使用方法是确…

Linux运维:MySQL数据库(1)

1.信息与数据: 数据是信息的载体,信息是数据的内涵。数据库就是存储数据的仓库,并长期存储在计算机磁盘中,可由多个用户和应用程序共享的数据集合,就是数据库。 2.数据库中的数据的特点: 2.1.数据是按照某…

ai assistant 是所有编程助手中最出色的一款 ?

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

element-plus 日期选择添加确定按钮

需求&#xff1a;选择日期后&#xff0c;点击确定按钮关闭面板 思路&#xff1a; 使用shortcuts自定义确定和取消按钮选择日期后使用handleOpen()强制开启面板点击确定后使用handleClose()关闭面板 <template><el-date-pickerref"pickerRef"v-model"…

【Linux】对共享库加载问题的深入理解——基本原理概述

原理概述 【linux】详解——库-CSDN博客 共享库被加载后&#xff0c;系统会为该共享库创建一个结构&#xff0c;这个结构体中的字段描述了库的各种属性。在内存中可能会加载很多库&#xff0c;每一个库都用一个结构体描述。把这些结构体用一些数据结构管理起来&#xff0c;系…

盲盒小程序:线上盲盒发展机遇

盲盒已经成为了当下年轻人的潮玩首选方式。随着二次元、影视行业的快速发展&#xff0c;给盲盒提供了各种新的发展方向&#xff0c;盲盒商品也在不断创新&#xff0c;种类丰富多样。玩家在拆盲盒时随机获得某一商品&#xff0c;具有惊喜感和刺激性。 目前&#xff0c;随着小程…

深入剖析Tomcat(十、十一) 详解StandardWrapper

《深入剖析Tomcat》第十章介绍了Tomcat的安全机制&#xff0c;主要就是对servlet的访问做安全验证&#xff0c;如果Tomcat中设置了某些servlet需要指定角色的用户才能访问&#xff0c;则需要客户端进行登录验证&#xff0c;如果用户名密码正确并且该用户拥有该角色的话&#xf…

Vite 动态导入警告问题解决方案

如上图我要实现从后台获取权限菜单并动态导入进行渲染 但由于 vite 暂时不支持这种导入方式 图中也给出了提示 本人也是这么去做了 但并没什么卵用 后来参考了 vite 的 import.meta.glob 这种方式 我在处理菜单权限控制的菜单里进行了如下操作&#xff1a; …

数据转换 | Matlab基于R对称点模式(symmetric dot pattern, SDP)一维序列信号转二维时频图象

目录 效果分析基本介绍程序设计参考资料获取方式 效果分析 基本介绍 数据转换 | Matlab基于R对称点模式(symmetric dot pattern, SDP)一维序列信号转二维时频图象 SDP常被用于信号分析和深度学习模式识别。 SDP是一种基于极坐标系的图像表示方法&#xff0c;可以直接将原始信…

版本控制工具-git的基本使用

目录 前言一、git简介二、git工作流程三、安装git并配置git3.1 配置用户名和邮箱3.2 配置.gitignore文件&#xff08;可选&#xff09;3.3 配置ssh key&#xff08;可选&#xff09; 四、git基本命令4.1 创建本地仓库4.2 将工作区内容提交到本地仓库4.3 将本地仓库内容推送到远…

【例子】webpack 开发一个可以加载 markdown 文件的加载器 loader 案例

Loader 作为 Webpack 的核心机制&#xff0c;内部的工作原理却非常简单。接下来我们一起来开发一个自己的 Loader&#xff0c;通过这个开发过程再来深入了解 Loader 的工作原理。 这里我的需求是开发一个可以加载 markdown 文件的加载器&#xff0c;以便可以在代码中直接导入 m…

nacos漏洞汇总

1 nacos介绍 1.1 nacos是啥 Alibaba Nacos是阿里巴巴推出来的一个新开源项目&#xff0c;是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;可以快速实现动态服务发现、服…

【数据结构】(C语言):动态数组

动态数组&#xff1a; 内存区域连续&#xff0c;即每个元素的内存地址连续。可用索引查看元素&#xff0c;数组[索引号]。指定位置删除元素&#xff0c;该位置之后的元素全部往前移动一位。指定位置添加元素&#xff0c;从最后到该位置的元素全部往后移动一位。物理大小&#…

量化交易 - 策略回测

策略回测 1、什么是策略回测&#xff1f;2、策略回测的作用3、策略回测系统概述3.1策略回测中相关的指标介绍3.2量化交易策略的资金容量3.3 完整的策略回测系统包含哪些内容 1、什么是策略回测&#xff1f; 策略回测&#xff0c;也称之为策略回溯测试&#xff0c;是指利用交易…

NLP经典论文研读--xlnet论文代码复现记录

xlnet源码解读(简易pytorch实现版本) xlnet这个模型还是相当复杂的&#xff0c;我看了很长一段时间也还是有很多地方没有搞明白&#xff0c;最后又在网上搜了很多大佬写的相关博客&#xff0c;才算是大致弄明白了&#xff0c;想了解xlnet的原理&#xff0c;请参考原论文&#…

微服务框架中的Eureka和Ribbon的个人理解

微服务框架需要学习的东西很多&#xff0c;基本上我把它分为了五个模块&#xff1a; 第一&#xff1a;微服务技术模块 分为三个常用小模块&#xff1a; 1.微服务治理&#xff1a; 注册发现 远程调用 配置管理 网关路由 2.微服务保护&#xff1a; 流量控制 系统保护 熔断降级 服…

【尚庭公寓SpringBoot + Vue 项目实战】移动端登录管理(二十)

【尚庭公寓SpringBoot Vue 项目实战】移动端登录管理&#xff08;二十&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】移动端登录管理&#xff08;二十&#xff09;1、登录业务2、接口开发2.1、获取短信验证码2.2、登录和注册接口2.3、查询登录用户的个人信息 1、…

gbase 8c分布式升级步骤

GBase 8c 多模多态企业级分布式数据库具备高性能、高可用、弹性伸缩、高安全性等特性&#xff0c;可以部署在物理机、虚拟机、容器、私有云和公有云&#xff0c;为关键行业核心系统、互联网业务系统和政企业务系统提供安全、稳定、可靠的数据存储和管理服务。GBase 8c支持行存、…

视频号的视频怎么提取文案?详细教程来啦!

很多人不知道视频号的视频怎么提取文案&#xff0c;今天就和大家详细说说视频号视频提取文案的方法&#xff01; 众所众知视频号的视频无法下载&#xff0c;我们该怎么提取视频号的视频呢&#xff1f; 关于下载视频号的视频&#xff0c;首先给大家两种方案&#xff0c;一种就是…