ZipList(压缩链表)

基本概述

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)。新增、删除都可能导致连锁更新的发生。

特性

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

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

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

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

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

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

相关文章

Mind2Web: 首个全面衡量大模型上网能力的数据集

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 在互联网的浩瀚世界中,存在着无数复杂而扑朔迷离的任务等待我们去解决。如果要设计一个解决很多问题的通用智能体(AI agent),无论是关于购物、旅行、学习还是娱乐,…

MySQL高级篇第二天

文章目录 一、Mysql的体系结构概览 二、 存储引擎 三、优化SQL步骤 一、Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 O…

感觉被榨干了,被美团拷打一小时...

普通本科毕业后,进了一家互联网公司,这几年里不断在积累经验,最终选择跳到美团,涨薪了50%,下面分享一下我个人的面经和一些心得建议。 面经 面团一面 自我介绍专业技能一条条核对下来 有软件测试流程、用例设计方法…

快速入门教程:神经常微分方程 (Neural ODE)

神经常微分方程(Neural Ordinary Differential Equations,简称 Neural ODE)是一种基于常微分方程(Ordinary Differential Equations,ODEs)的深度学习方法,它结合了传统的ODE数值求解技术和神经网络模型。通过使用ODE来建模数据的演化过程,Neural ODE可以自动地学习数据…

力扣题库刷题笔记3--无重复字符的最长子串

1、题目如下: 2、个人Python代码实现如下: 代码如下: class Solution: def lengthOfLongestSubstring(self, s: str) -> int: temp "" #临时变量,记录当前连续不重复子串 out_put …

中国市场成为高阶智驾战略高地,博世/安波福包揽四项大奖

高工智能汽车研究院监测数据显示,2022年度中国市场(不含进出口)乘用车前装标配搭载辅助驾驶(L0-L2)交付1001.22万辆,首次突破千万辆规模,同时,前装搭载率也首次突破50%大关。 此外&a…

我用AI提高我的代码质量,周边同事对我的代码赞不绝口,速来围观

文章目录 前言功能演示1.使用Stream API来简化集合操作2.使用switch语句来替代多个if-else语句3.使用try-with-resources语句来自动关闭资源4. Lambda 表达式来简化代码,并提高代码的可读性和可维护性5.查找代码中的bug并优化6.python 使用sort方法来对列表进行排序7.javaScrpi…

【docker桌面版】windows使用docker搭建nginx

1.拉取nginx镜像 docker pull nginx 2.运行容器 docker run -d -p 80:8081 --name nginx nginx 3.本地磁盘创建nginx目录 D:\Docker\project\nginx 4.复制docker中的nginx配置文件 查看运行的容器docker ps -a docker cp 8f18d58bc77b:/etc/nginx/nginx.conf D:\Docker…

docker ansible与剧本模式

ansible(跨主机编排) ansible 是一个基于python开发的配置管理和应用部署和管理工具,现在也在自动化管理领域大放异彩,他融合了众多老牌运维工具的优点,pubbet和saltstack能实现的功能,ansible基本上都可以…

Docker使用记录

文章目录 Docker基本使用Docker配置查看状态卸载安装使用 apt 存储库安装在 Ubuntu 上安装 Docker 桌面(非必要) Docker实例使用现有的镜像查找镜像拖取镜像列出镜像列表更新镜像导出镜像删除镜像导入镜像清理镜像查看容器导出容器导入容器-以镜像的方式创建容器重启容器进入容…

虚函数表不一定总是在对象的起始位置

在我之前的一篇文章 “COM 对象的内存布局”中,作为举例,我将对象的虚函数表指针放置在了底层 C 对象的起始位置,但是值得注意的是,虚函数表指针指向的位置并没有一个实际的标准。即使将虚函数表放置在对象中间,甚至是…

零基础想转行做python爬虫及数据分析方向的程序员,有哪些书可以推荐?

学习Python语言是一个不错的选择,一方面Python的应用广泛,在大数据、人工智能、Web开发等领域有大量的使用,另一方面Python语言本身比较简单,非常适合初学者。 Python是完全可以自学的,如果英语基础还可以的话&#x…

Maxwell安装使用

​欢迎光临我的博客查看最新文章: https://river106.cn 1、Maxwell简介 Maxwell 是由美国Zendesk开源,用Java编写的MySQL实时抓取软件。读取 MySQL binlogs 并将修改行字段的更新写入 Kafka, Kinesis, RabbitMQ, Google Cloud Pub/Sub 或 Redis (Pub/Sub or LPUSH)…

3. SpringCloudAlibaba、nacos 实现配置中心

一、微服务中配置文件的问题 1.1 配置文件的问题: 配置文件的数量会随着服务的增加持续递增单个配置文件无法区分多个运行环境配置文件内容无法动态更新,需要重启服务 1.2 引入配置中心 引入配置中心:刚才架构就会成为这样。是由配置中心统…

2023上半年的九个觉悟

‍觉悟,就是觉了、悟了。有时候,你看到一句话,突然就觉悟了。 一、资本主义的问题 “资本主义把我们都缩减成了一个东西:消费者” 因此,人人都成为资本家利诱、操控、围猎的对象。 同时,金钱成为全民的神&a…

JVM垃圾回收算法及Java引用

目录 Java垃圾回收算法 1.标记清除算法:Mark-Sweep 2.复制算法:copying 3. 标记整理算法:Mark-Compact 4.分代收集算法 5.新生代垃圾回收算法:复制算法 6.老年代:标记整理算法 7.分区收集算法 Java引用 1.Ja…

ROS-melodic:源码安裝teb_local_planner算法、替换DWA算法

一.安裝teb_local_planner算法 源码下载地址:GitHub - rst-tu-dortmund/teb_local_planner: An optimal trajectory planner considering distinctive topologies for mobile robots based on Timed-Elastic-Bands (ROS Package) 注意选择对应ROS版本的代码。 放在…

爬虫 python 正则匹配 保存网页图片

目录 1. 简介1.1 爬虫1.2 爬虫语言1.3 python库1.4 我的步骤 2. 导入包2.1 代码2.2 requests库 3. 写入文件函数4. 获取图片5. 主函数5.1 代码5.2 说明一下webbrowser 6. 所有代码7. 其他(可以忽略)8. 总结 在这里我只提供的是一种方法,有很多…

SpringMVC 万字通关

文章目录 1. 什么是 Spring MVC?1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系 2. Spring MVC 有什么用 ?3. 如何学 Spring MVC ?3.1 Spring MVC 的创建3.2 实现连接功能3.2.1 RquestMapping 详解1. RequestMapping 支持什么请求?2. 请求限定3. GetMapping 和 PostMapping4. c…

【Android -- JNI 和 NDK】Java 和 C/C++ 之间传递参数和返回值

本文主要介绍 JNI 的数据传递上,即 Java 如何传递对象给 C; 而 C 又如何将数据封装成 Java 所需的对象。 1. 基本数据类型 传递 java 的基本类型是非常简单而直接的,一个 jxxx 之类的类型已经定义在本地系统中了,比如:jint, jby…