ZipList是 Redis 中一种非常紧凑、节省内存的数据结构 Ziplist(压缩列表) 的内部内存布局。它被用于存储元素较少的 List、Hash 和 Zset。

下面我们来详细介绍每一个节点的含义:
在这里插入图片描述

1. zlbytes (ziplist bytes)

  • 含义: 整个压缩列表占用的总字节数。
  • 类型: 32位无符号整数(uint32_t),固定占用 4 个字节。
  • 作用: 这个字段记录了 Ziplist 的总大小。有了它,程序无需遍历整个列表就能知道其边界,这在进行内存重分配(realloc)时非常有用,可以直接告诉内存管理器需要多大的空间。

2. zltail (ziplist tail)

  • 含义: 指向列表中最后一个元素(entry)的偏移量(offset)。
  • 类型: 32位无符号整数(uint32_t),固定占用 4 个字节。
  • 作用: 这个字段允许程序在 O(1) 的时间复杂度内定位到 Ziplist 的最后一个节点,而无需从头遍历。这使得从列表尾部进行 pop(弹出)等操作非常高效。

3. zllen (ziplist length)

  • 含义: 压缩列表中的节点(entry)数量。
  • 类型: 16位无符号整数(uint16_t),固定占用 2 个字节。
  • 作用: 提供了在 O(1) 时间复杂度内获取列表长度的能力。
  • 特殊情况: 由于它只有16位,最大只能表示 65535。如果 Ziplist 中的节点数超过或等于 65535,这个字段会被设置为特殊值 65535 (FFFF)。在这种情况下,要获取真实长度,就必须遍历整个列表来统计,时间复杂度会退化为 O(N)。不过,Ziplist 的设计初衷就是用于存储少量数据,所以这种情况很少见。

4. entry (列表节点)

  • 含义: 这部分是 Ziplist 的核心,用来存储实际的数据元素。图中的 entry1, entry2, entry3 代表连续存放的多个节点。
  • 结构: 每个 entry 自身的结构也非常精巧,它由三个部分组成:
    1. previous_entry_length (前一节点的长度): 这个字段记录了前一个节点所占用的总字节数。它的存在是实现从后向前遍历 Ziplist 的关键。通过当前节点的地址减去这个长度,就可以得到前一个节点的起始地址。这个字段本身的长度是可变的(1字节或5字节),以节省空间。
    2. encoding (编码): 这个字段指明了 content 部分的数据类型(是字符串还是整数)以及它的长度。编码字段本身也是变长的,通过不同的二进制位模式来表示不同的编码方式,实现了极致的空间优化。
    3. content (内容): 实际存储的数据,可以是整数或一个字节数组(字符串)。其长度由 encoding 字段决定。

5. zlend (ziplist end)

  • 含义: 压缩列表的结束标记。
  • 类型: 8位无符号整数(uint8_t),固定占用 1 个字节。
  • 值: 它的值永远是 255 (二进制 11111111,十六进制 0xFF)。
  • 作用: 作为一个明确的终止符,当程序遍历列表时,一旦遇到这个值,就知道已经到达了列表的末尾。

总结

Ziplist 的设计精髓在于 “紧凑”。它不像常规链表那样为每个节点都使用前后指针(在64位系统上,一个指针就占8字节),而是通过存储前一节点的长度 (previous_entry_length) 和利用连续内存布局,实现了双向遍历,从而极大地节省了内存。图中 zlbytes, zltail, zllen 这三个头部字段,共同为这个紧凑的结构提供了高效的宏观操作能力。

下一篇:

(ZipList入门笔记二)为何ZipList可以实现内存压缩,可以详细介绍一下吗

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unix 发展史概览

这里是一个简明清晰的 Unix 发展史概览,涵盖从起源到现代的重要节点和演变过程。Unix 发展史概览 1. Unix 起源(1969年) 贝尔实验室:Ken Thompson 和 Dennis Ritchie 开发出 Unix 操作系统。最初设计目标:简洁、可移植…

基于coze studio开源框架二次定制开发教程

目录 一、 项目介绍 1.1 什么是Coze Studio 1.2 功能清单 1.3对比商业版本 二、 功能定开说明 2.1 技术栈简介 2.2 项目架构

RHCE认证题解

考前说明请勿更改 IP 地址。DNS 解析完整主机名,同时也解析短名称。• 所有系统的 root 密码都是 redhat• Ansible 控制节点上已创建用户账户 devops。可以使用 ssh 访问• 所需的所有镜像保存在镜像仓库 utility.lab.example.compodman 可使用下述账号登录使用 用…

调用com对象的坑

1、谏言 最近我在弄64位调用32位dll的问题,在几种IPC之间,最后考虑了调用COM 毕竟我们只在windows平台 2、第一坑–修改编译后都需要重新注册,注册表 一直以为只需要编译就好了,结果调用没反应、报错什么的,需要先撤销…

【Python】PyQt 实现 TreeWidget 多级联动选择逻辑,打造素材搜索自定义树形控件!

在开发自己的写作素材管理工具时,我遇到了一个非常典型但又略显棘手的 UI 问题: 💡 如何实现一个“可自由勾选分类标签”的树形结构界面,支持父子节点自动联动勾选,提升用户体验? 虽然 PyQt 的 QTreeWidget 是构建多层分类结构的好帮手,但默认却不具备父子节点的自动级…

27-数据仓库与Apache Hive-2

1.数仓开发语言概述 理论上来说,任何一款编程语言只要具备读写数据、处理数据的能力,都可以用于数仓的开发。比如大家耳熟能详的C、java、Python等; 关键在于编程语言是否易学、好用、功能是否强大。遗憾的是上面所列出的C、Python等编程语言…

软件测试——接口自动化

测试中的自动化分为两类: 1.ui自动化(web、移动端)2.接口自动化 前面的博客中,我们已经讲解了web端的ui自动化,感兴趣的同学可以去看看:软件测试——自动化测试常见函数_自动化测试代码编写-CSDN博客 今…

Flask一个用户同时只能在一处登录实现

场景:web页面如果多人用同一账号同时登录操作,可能会导致数据等的混乱甚至出现故障。并且可能损害开发者的利益。为此,本篇文章就讲下如何实现同一账户同时仅能一个地方登录操作。 思路:1. 用户登陆时生成token(uuid.u…

联发科芯片组曝高危漏洞:越界写入缺陷危及智能手机与物联网设备安全

漏洞概况全球领先的芯片组制造商联发科(MediaTek)近日发布最新产品安全公告,披露了影响其智能手机、物联网设备及其他嵌入式系统芯片的多项安全漏洞。高危漏洞分析CVE-2025-20696 作为公告披露的首个且最严重的漏洞,该高危缺陷源于…

Android与Flutter混合开发:页面跳转与通信完整指南

Android与Flutter混合开发:页面跳转与通信完整指南 一、Android跳转Flutter页面的实现方式 1. 基础跳转方法 (1)使用全新引擎跳转(每次新建) startActivity(FlutterActivity.withNewEngine().initialRoute("/home…

Web存储技术详解:sessionStorage、localStorage与Cookie

一、核心特性对比特性CookielocalStoragesessionStorage存储大小4KB左右5-10MB5-10MB生命周期可设置过期时间永久存储(除非手动清除)会话期间有效(标签页关闭即清除)作用域同源的所有窗口同源的所有窗口仅当前标签页自动发送每次H…

3. 为什么 0.1 + 0.2 != 0.3

总结 底层是二进制实现概述 在 JavaScript 中,0.1 0.2 的结果并不是精确的 0.3,而是 0.30000000000000004。这个现象并不是 JavaScript 的“bug”,而是由于浮点数在计算机底层的二进制表示方式导致的精度丢失问题。一、计算机如何表示小数&a…

股票数据接口哪家好?专业评测各主流接口的优势与不足

Python股票接口实现查询账户,提交订单,自动交易(1) Python股票程序交易接口查账,提交订单,自动交易(2) 股票量化,Python炒股,CSDN交流社区 >>> 股票…

如何用分布式架构视角理解宇宙稳定性?从精细调参到微服务的类比思考

在调试一段多线程分布式代码时,我忽然意识到一个不合理的事实:为什么现实世界这么稳定?为什么没有“宇宙蓝屏”或“感知崩溃”?为什么每天醒来,我们还能看到同样的物理规律、感知同一个自我?站在程序员的角…

游戏画面总是卡顿怎么办 告别延迟畅玩游戏

玩游戏最让人头疼的问题之一就是画面卡顿,影响操作流畅度与游戏体验。卡顿可能由硬件性能、系统设置、网络延迟等多种因素导致。本文将从不同角度出发,为你提供五个有效解决方法,帮助你快速提升游戏流畅度。 一、降低游戏画质设置 高画质虽然…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码

在现代Web应用中,密码重置功能是用户账户安全体系中不可或缺的一部分。本文将详细介绍如何使用Vue.js前端框架和SpringBoot后端框架实现一个基于邮箱验证的密码重置功能。功能概述本密码重置功能包含以下核心流程:用户输入注册邮箱系统发送验证码到该邮箱…

华为云云产品的发展趋势:技术创新驱动数字化未来

近年来,随着5G、人工智能(AI)、大数据、物联网(IoT)和边缘计算等新兴技术的快速发展,全球云计算产业正迎来新一轮变革。作为中国领先的云服务提供商,华为云依托华为集团在ICT(信息与…

防御保护07-08

CIDR 可变长子网掩码 VLSM 无类域间路由NET 用少量的私有地址替换大量的共有地址私网地址不能再互联网上去使用、去分配。这里的互联网指的是公网。服务器映射--用来使外部用户能访问私网服务器。静态映射--公网地址和私网地址进行一对一的映射。地址池--中存在多个公网IP地址时…

PDF转图片工具技术文档(命令行版本)

PDF转图片工具技术文档(命令行版本) 1. 功能概述 本工具是一个基于PyMuPDF库的PDF转图片命令行工具,能够: 通过命令行参数接收PDF文件路径将PDF的每一页转换为PNG格式的图片自动创建输出目录(./static)保存…

k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC

为响应政策,最近在捣鼓国产化云原生平台的搭建。在搭建过程中遇到了问题记录下来,以备后续查找。 我选用了中国电子云的云平台来搭建K8S集群,选用的技术栈是华为开源的openeulerk8sisulad框架,参考官网文档资料:iSula…