【Redis】数据结构(中)----ZipList(压缩列表)

文章目录

  • ZipList(压缩列表)
    • 概念
    • `ZipList`的结构
    • `Entry`的内部结构
      • `previous_entry_length`
      • `Encoding`
        • 存储字符串
        • 存储整数
      • `content`
    • `ZipList`会存在的问题
      • 查询中间数据
      • 连锁更新
  • 总结

ZipList(压缩列表)

概念

ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成(所以本质上并不是链表,但是具有链表的特性).可以在任意一段进行压入/弹出操作,并且该操作的时间复杂度为O(1).

ZipList的结构

在这里插入图片描述
各属性含义:
在这里插入图片描述

这里我们看到,entry长度是不定的,也就是说,每个entry节点的大小并不是统一的,而是根据数据的大小来进行动态变化,这也是ZipList可以节省空间的关键

那么这里会引入一个问题:ZipList是如何进行寻址的呢?
这与entry的内部结构有关系.

Entry的内部结构

在这里插入图片描述

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

Entry为什么这么设计:
这样设计,保证了正序遍历和逆序遍历.
正序遍历:正序遍历比较容易理解,因为ZipList连续的内存空间,所以此处只需要从第一个entry起始地址开始,不断移动指针,便可以遍历完整个ZipList.
逆序遍历:
在这里插入图片描述

previous_entry_lengthencoding都采用小端字节序来进行存储的.

  • 小端字节序:低位字节在前,高位字节在后.例如:数值0x1234,采用小端字节序来进行存储时,实际的存储值为0x3412.

previous_entry_length

previous_entry_length:记录前一个节点的长度.

  • 此时我们要存储字符串"ab"时,前面没有节点,所以此处为0,转换为16进制,就应该为0x00.

Encoding

Encoding:编码属性,记录当前content的数据类型(字符串还是整数)以及长度,占用1个,2个或者5个字节

存储字符串

首先是存储字符串的表示方式:
如果encoding是以00,01,10开头,则证明content是字符串

  • 00:表示encoding的长度为1字节
  • 01:表示encoding的长度为2字节
  • 10:表示encoding的长度为5字节,且第1个字节不表示长度
    在这里插入图片描述
    例如还是存储"ab",此时"ab"2字节,所以entry只需要占1字节即可,所以二进制形式应该表示为00000010,转化为16进制,表示为0x02
存储整数

如果encoding是以11开始,则证明content是整数,且encoding固定只占用1个字节
在这里插入图片描述
这里我们需要关注最后一种存储方式1111****,这里适用于比较小的整数,比如存储2,这时并不需要将数据内容存放到content中,只需要存储到encoding中即可,此时的encoding表示为11110011.转化为16进制,表示为0xf3,这样做的目的也是为了节省内存空间.

content

此处便是存储数据 的位置,比较简单,比如"ab",此处转化为16进制数据后,可以得到:0x610x62.

综上所述:ZipList使用场景非常广泛,原因是:ZipList节省内存方面作出了很多努力.
ZipList只能做到正序遍历和倒序遍历,所以如果查询的内容位于中间,这就会带来数据遍历效率低的问题.也就是说:ZipList的数据查询和链表是一样的,只不过在节省空间方面,ZipList会更加优良

ZipList会存在的问题

查询中间数据

我们了解到,ZipList相当于一个具有连续内存空间双向链表,那么就会具有双向链表中存在的中间数据遍历效率低的问题,因为ZipList并不能直接进行

连锁更新

ZipList某种特殊情况下产生的连续空间扩展操作称之为连锁更新

现在,假设我们有N个连续的,长度为250~253字节之间的entry,因此entryprevious_entry_length属性用1个字节即可表示,如下图所示:
在这里插入图片描述
此时,如果我们在第一个节点前面加上一个260字节长度的entry此时,之前的第一个entry中的pre_entry_length就需要从占用1字节变为占用5字节,此时后续的entry均需要发生这样的改变.这样就带来了连锁更新的情况
在这里插入图片描述
但是,连锁更新的情况,在Redis当中,并没有进行解决,原因是这种特殊情况是比较罕见的,需要同时满足:要有连续的,N个字节数250~253之间长度的entry.

总结

  • 压缩列表可以看做是一种连续内存空间的"双向链表"
  • 列表的节点之间不是通过指针链接,而是记录上一节点和本节点的长度来寻址,内存占用较低
  • 如果列表数据过多,导致链表过长,可能影响查询性能
  • 增或者删除较大数据时,都可能会发生连锁更新的问题

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

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

相关文章

解决Git拉取项目后右侧边栏无Maven的问题

从gitlab上拉取新项目,当你配置好maven仓库地址,配置文件,各种库都配置好了,但是没有Maven,找不到下图的package因此打包不了项目解决办法 非常简单,只需一步! 右击项目里面的pom.xml,再点击add…

uniapp小程序自定义聚合点

注&#xff1a; 1.默认的聚合点可以点击自动展示子级点位&#xff0c;但是自定义的聚合点在ios上无法触发markerClusterClick的监听&#xff0c;至今未解决&#xff0c;不知啥原因 2.ios和安卓展示的点位样式还有有差别 源码附上 <template><view class"marke…

算法——python实现归并排序

文章目录 归并排序NB三人组总结 归并排序 """ 归并排序 """""" 时间复杂度 &#xff1a; O(N*logN) 空间复杂度 &#xff1a; O(N) 需要额外生成一个临时变量&#xff0c;最大是N长 思路&#xf…

[Linux网络编程]03-TCP协议

一.TCP协议数据通信的过程 TCP数据报如下&#xff0c;数据报中的标志位双端通信的关键。 三次握手: 1.客户端向服务端发送SYN标志位&#xff0c;请求建立连接&#xff0c;同时发送空包 2.服务端向客户端回发ACK标志位(即确认标志位&#xff0c;任何一端发送数据后都需要另一端…

Nginx UI 一个可以管理Nginx的图形化界面工具

Nginx UI 是一个基于 Web 的图形界面管理工具&#xff0c;支持对 Nginx 的各项配置和状态进行直观的操作和监控。 Nginx UI 的功能非常丰富&#xff1a; 在线查看服务器 CPU、内存、系统负载、磁盘使用率等指标 在线 ChatGPT 助理 一键申请和自动续签 Let’s encrypt 证书 在…

[JAVAEE] 线程安全问题

目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…

C++ string的精讲

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 string是标准库中的一个类&#xff0c;它位于<string>头文件中。这个类提供…

Python算法——链表(反转链表,合并两个排序链表,判断是否有环,链表中倒数最后k个结点,第一个公共结点,删除重复元素)

哈喽大家好&#xff0c;好久不见&#xff01;又进入新的一个学期&#xff0c;这学期小编要进行python的算法学习啦&#xff0c;今天更新链表的部分题目~ 牛客 NC78 反转链表 题目如下&#xff1a; 算法思想如下&#xff1a; 1.初始化两个指针pre和cur&#xff0c;分别表示前驱…

ERROR [internal] load metadata for docker.io/library/nginx:latest

docker执行错误解决方法 1、执行docker pull nginx2、docker build -t xxx:xx

Ai环境安装教程

依赖的驱动软件 python3.115cuda11.4torch2.0.1 一。如何下载安装 一、驱动下载 【Python链接】https://www.python.org/ftp/python/3.11.5/python-3.11.5-amd64.exe 【CUDA链接】https://developer.download.nvidia.com/compute/cuda/11.4.4/local_installers/cuda_11.4.4…

从 Microsoft 官网下载 Windows 10

方法一&#xff1a; 打开 Microsoft 官网&#xff1a; 打开开发人员工具&#xff08;按 F12 或右键点击“检查”&#xff09;。 点击“电脑模拟手机”按钮&#xff0c;即下图&#xff1a; 点击后重新加载此网页&#xff0c;即可看到下载选项。

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…

Notepad++将搜索内容所在行选中,并进行复制等操作

背景 Notepad在非常多的数据行内容中&#xff0c;按照指定内容检索&#xff0c;并定位到具体行&#xff0c;而后对内容行的数据进行复制、剪切、删除等处理动作。 操作说明 检索并标记所在行 弹出搜索框&#xff1a;按下 Ctrl F。 输入查找字符串&#xff1a;在搜索框中输入要…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

java项目之精准扶贫管理系统源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的精准扶贫管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 精准扶贫管理系统的主要…

STM32重拾+找工作MD

1.工程文件创建 外部的文件夹要和工程文件对应&#xff0c;也就是外面创建好之后&#xff0c;里面也要对应添加&#xff1b; 首先是startup启动文件&#xff0c;这个是程序执行最基本的文件&#xff0c;keil中启动文件是用汇编写的&#xff0c;启动文件内定义了中断向量表&…

Java面试指南:Java基础介绍

这是《Java面试指南》系列的第1篇&#xff0c;本篇主要是介绍Java的一些基础内容&#xff1a; 1、Java语言的起源 2、Java EE、Java SE、Java ME介绍 3、Java语言的特点 4、Java和C的区别和联系&#xff1f; 5、面向对象和面向过程的比较 6、Java面向对象的三大特性&#xff1a…

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv&#xff01; 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级&#xff01;服务详情可以在官网查看详细解读&#xff01; 那些因为老旧版本而被攻击的例子 话不多说&#xff0c;直接上图&a…

QT实现校园导航

导航是地图类项目实战中经常会遇到了。看上去貌似没头绪&#xff0c;其实是有模板遵循的。我们直接根据图看代码。 //MainWidget.h#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include "mapwidget.h" #include <QToolButton> #in…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…