ZipList(压缩链表)

news2024/11/25 10:58:47

基本概述

ZipList 是一种特殊的“双端链表” ,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。

基本结构:

image-20230613233945617

各部分所占字节、基本介绍:

image-20230613234217960

entry,节点占用字节不固定(按需分配、节省内存)

ZipListEntry

ZipList 中的Entry并不像普通链表那样记录前后节点的指针,因为记录两个指针要占用16个字节,浪费内存。而是采用了下面的结构:

image-20230613234501554

  • previous_entry_length:前一节点的长度,占1个或5个字节
    • 如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值
    • 如果前一节点的长度大于254字节,则采用5个字节来保存这个长度值,第一个字节为0xfe,后四个字节才是真实长度数据
  • encoding:编码属性,记录content的数据类型(字符串还是整数)以及长度,占用1个、2个或5个字节
  • contents:负责保存节点的数据,可以是字符串或整数

ZipListEntry中的encoding编码分为字符串整数两种:

详细见 p150(黑马redis)

  • 字符串: 如果encoding是以“00”、“01”或者“10”开头,则证明content是字符串(一般用上面两种)

image-20230613234721325

  • 整数: 如果encoding是以“11”开始,则证明content是整数,且encoding固定只占用1个字节

image-20230613235014135

虽节省内存但遍历有一定缺陷,只能从前向后或者从后向前,使用时对节点个数会有一定限制

ZipList的连锁更新问题

ZipList的每个Entry都包含previous_entry_length来记录上一个节点的大小,长度是1个或5个字节:

  • 如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值
  • 如果前一节点的长度大于254字节,则采用5个字节来保存这个长度值,第一个字节为0xfe,后四个字节才是真实长度数据

有这样一种出现概率极低的场景:有N个连续的、长度为250~253字节之间的entry,因此entry的previous_entry_length属性用1个字节即可表示,如图所示:

image-20230613235328671

此时,在列表节点头部插入一个254bytes的节点,会导致连续更新节点previous_entry_length字节长度(连续多个字节长度由1变为5),多出许多挪动节点位置以及申请额外空间的开销

image-20230613235607526

ZipList这种特殊情况下产生的连续多次空间扩展操作称之为连锁更新(Cascade Update)。新增、删除都可能导致连锁更新的发生。

特性

① 压缩列表的可以看做一种连续内存空间的"双向链表"

② 列表的节点之间不是通过指针连接,而是记录上一节点和本节点长度来寻址内存占用较低

③ 如果列表数据过多,导致链表过长,可能影响查询性能(只能从前向后或者从后往前遍历)

④ 增或删较大数据时有可能发生连续更新问题(概率极低)

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

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

相关文章

计算机图形学与opengl C++版 学习笔记 第9章 天空和背景

目录 9.1 天空盒9.2 天空穹顶9.3 实现天空盒9.3.1 从头开始构建天空盒9.3.2 使用OpenGL立方体贴图 9.4 环境贴图补充说明 对于室外3D场景,通常可以通过在地平线上创造一些逼真的效果,来增强其真实感。当我们极目远眺,目光越过附近的建筑和森林…

【认知提升思维篇】之 心智模式--人类的行为纪元

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:普本…

国产FPGA:替代ATLERAEP4CE10E22的AG10KL144

背景 AG10K用于PIN TO PIN替代ATLERA EP4CE10E22、EP3C10E144的FPGA,其资源介绍如下: 引脚对应如下: 一般Quartus II开发方式 新建工程 FPGA使用Quartus II开发,开发的整体流程如下: 新建工程时选用Cyclone II…

Liunx系统重修二【常用指令】

LIunx主要做服务器端的操作系统,不会做PC端操作系统的原因是因为: 第一图形化不好,第二软件生态不强! 在Liunx系统中都是使用命令来操作! Liunx系统中常用的指令并不多!一天就可以学完! 6&…

chatgpt赋能python:Python如何将图片文件上传至服务器

Python如何将图片文件上传至服务器 在现代网站设计中,图片的使用非常重要,因此将图片文件上传至服务器是一个很常见的操作。Python是一种广泛使用的编程语言,其拥有强大的图像处理能力,并提供了丰富的库来实现文件的上传和下载。…

【SCADA】KingSCADA实现小车移动控制

哈喽,大家好,我是雷工! 在做SCADA项目时,时常会涉及到控制小车运动的情况,今天通过样例演示在KingSCADA中实现小车移动控制。 一、界面设计及效果演示 1、主画面 以下为测试样例的简单界面。 2、效果展示 当点击…

【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】

【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】 🔻 一、安装前规划🔻 二、安装前准备一(系统参数修改)⛳ 2.1 内核版本、系统版本查看⛳ 2.2 修改主机名-重启生效⛳ 2.3 关闭selinux⛳ 2.4 防火墙设置1521端口开放⛳ 2.5…

安全测试工具OWASP ZAP下载

下载 owasp作为一个开源免费的安全测试工具,集成了各种工具的渗透测试框架,还是非常不错滴,安装步骤就放在这啦 1.下载地址: https://www.zaproxy.org/download/ 2.进入后根据自己电脑系统自行下载 3.下载完成后,解压…

【OpenMMLab AI实战营二期笔记】第八天 语义分割与MMSegmentation

1.什么是语义分割 1.1 任务: 将图像按照物体的类别分割成不同的区域,相当于对每个像素进行分类。 1.2 应用: 无人驾驶汽车 人像分割 实时替换视频背景 智能遥感 分辨地表物体的类别,通过右侧分割之后的图像可以看到&#x…

高性能服务器-I/O多路复用(epoll)

系列文章目录 第一章 高性能服务器技术栈 (select) 第二章 高性能服务器技术栈 (epool/poll) 文章目录 系列文章目录前言一、epoll 接口二、epoll 原理三、epoll 触发方式四、设置阻塞方式代码 实例总结参考 前言 在网络中实现IO多路复用的技术,最常用的就是(sele…

linux(线程概念)

目录: 1.概念 2.linux线程与接口的关系 3.代码验证(线程是进程模拟的) ------------------------------------------------------------------------------------------------------------------------------- 1.概念 一般教材:…

STM32驱动Realtek RTL8189ES WiFi模块读取MAC地址并下载固件

单片机:STM32F103RE 接口:SDIO Keil 5工程下载链接:https://pan.baidu.com/s/1yIgUJUZcwWOL7xnwA9Rw2Q?pwdftxd Wi-Fi模块电源引脚的连接方法: 【RTL8189ES读取片内MAC地址的代码】 /* 显示WiFi模块参数信息 */ void WiFi_ShowI…

【力扣刷题 | 第八天】

前言: 本章将利用栈与队列来尝试解决实际问题。 20. 有效的括号 - 力扣(LeetCode) 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足&…

chatgpt赋能python:Python批量删除:简化SEO优化的过程

Python批量删除:简化SEO优化的过程 SEO(Search Engine Optimization)优化是网站运营中不可忽视的一项任务。其中涉及到对内容和网站结构的优化,而这些工作也离不开对数据的处理。其中一个常见问题是需要删除一批旧的或者无用的页…

《统计学习方法》——条件随机场(中)

引言 这是统计学习方法第十一章条件随机场的阅读笔记,包含所有公式的详细推导。 条件随机场(conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。 建议先阅…

chatgpt赋能python:Python怎么持续输入?

Python怎么持续输入? Python是一个高级编程语言,它的简单易用性让它成为程序员们心仪的语言之一。在Python编程中,输入是一个非常重要的环节。 在这篇文章中,我们将讨论Python如何进行持续输入。我们将介绍几种不同的方法&#…

计算机图形学与opengl C++版 学习笔记 第10章 增强表面细节

假设我们想要对不规则表面的物体进行建模,例如橘子凹凸的表皮、葡萄干褶皱的表面或月球的陨石坑表面。我们该怎么做?到目前为止,我们已经学会了两种可能的方法: (a)我们可以对整个不规则表面进行建模&…

【期末总复习】数字图像处理知识要点

【A卷】 【选择】 1、计算机器显示彩色图像的格式 2、灰度反转后(一副图像灰度级)的灰度值是几 3、灰度图像浅色背景下加圆环会导致什么后果 4、图像平滑的模板有哪些 5、γ矫正指的是什么数学变换 6、一阶锐化空间滤波器有哪些 7、图像复原、图像增强…

运维(SRE)成长之路-第1天 搭建虚拟机(图示)

1.Linux安装前准备 虚拟机:用软件(如:vmware,virtualbox等)模拟硬件,方便实验的灵活配置 虚拟化软件,建议使用 Vmware Workstation 虚拟硬件配置 CPU:2核或更多 内存:1G以上,推荐2…

chatgpt赋能python:Python中如何找出最小的2个值

Python中如何找出最小的2个值 Python作为一种高效可靠的编程语言,拥有出色的处理数据和算法的能力。在数据处理中,常常需要对数据进行排序并找出最小(或最大)的数值。本文将着重介绍如何在Python中找出最小的2个值。 方法1&…