Redis学习笔记:压缩列表

server/2024/12/22 20:58:17/

概述

压缩列表(ziplist)本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。

实现

Redis使用字节数组表示一个压缩列表,压缩列表结构示意如图所示:

压缩列表结构示意图4-1中各字段的含义如下。

  • zlbytes:压缩列表的字节长度,占4个字节,因此压缩列表最多有232-1个字节。
  • zltail:压缩列表尾元素相对于压缩列表起始地址的偏移量,用于访问表尾元素。
  • zllen:压缩列表的元素个数节、。
  • entryX:压缩列表存储的元素,可以是字节数组或者整数。
  • zlend:压缩列表的结尾。

如图是压缩列表元素entry的结构:

  • previous_entry_length:表示前一个元素的字节长度。
  • encoding:表示当前元素的编码,即content字段存储的数据类型(整数或者字节数组)。
  • content:实际数据保存的字段。

元素访问

压缩列表是通过偏移量来访问元素的,通过压缩列表的起始地址加上zltail就能得到最后一个元素的地址,每个元素中的previous_entry_length表示前一个元素的字节长度,再减去previous_entry_length就能得到前一个元素的起始地址,再访问前一个元素也是类似,通过这种方式就能遍历整个压缩列表。

参考

《Redis设计与实现》

《Redis5设计与源码分析》


http://www.ppmy.cn/server/132176.html

相关文章

神经网络反向传播交叉熵 计算损失函数对输出层偏置b2的梯度

本文是交叉熵损失函数为代表的两层神经网络的反向传播量化求导计算公式中的一个公式,单独拿出来做一下解释说明。 公式 8-15 是反向传播算法中,计算损失函数对输出层偏置 b 2 b_2 b2​ 的梯度。这个梯度用于指导偏置的更新,从而最小化损失函…

尚硅谷rabbitmq2024 集群篇仲裁队列 第52节 答疑

我们希望创建一个队列,队列分布在各个节点上,仲裁队列很好的解决了这个问题.那么在仲裁队列之前,创建一个队列,队列不是分布在各个节点上的吗? 在RabbitMQ中,默认情况下创建的队列是“普通队列”&#xff0…

【Linux】ioctl分析

简介 一个字符设备驱动通常会实现常规的open、release、read和write接口,但是如果需要扩展新的功能,通常以ioctl接口的方式实现。 #mermaid-svg-uY8EyPklf5e4ZMQo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…

简单实现手机、电脑相互操作

1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载图片 4、开启定时器 5、操作电脑UI事件 1、 private static void takeScreenshot(String path) {long t1 System.currentTimeMillis();String command "adb devices"; // 替换为你需要执行的shell命令Str…

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的一般形式: 二.判…

百度下拉框出词技术解密:72小时出下拉词软件原理分享

如何才能刷下拉词?这个问题一直是企业做流量时最纠结的问题,百度下拉词作为百度搜索体验中的一项智能化功能,极大地方便了用户快速完成搜索,也成为了企业在搜索引擎优化(SEO)策略中的重要流量入口。通过研究…

int QSqlQuery::size() const

返回结果的大小(返回的行数) 或者返回-1 (如果大小不能被决定 或者 数据库不支持报告查询的大小信息) 注意:对于非查询语句,将返回-1(isSelect()返回false) 如果查询不是活跃的&…

vue项目中使用websocket

一、单文件中引入使用 <template></template> <script>export default {websocket: true, // 标志需要使用WebSocketdata () {return {ws: null}},created () {this.ws new WebSocket(ws://127.0.0.1:8000); // ws服务地址this.ws.onopen () > {// 接收…