Redis核心数据结构之压缩列表(二)

压缩列表

压缩列表节点的构成

encoding

节点的encoding属性记录了节点的content属性所保存数据的类型及长度:

  • 1.一字节、两字节或者五字节长,值得最高位为00、01或者10的是字节数组编码:这种编码表示节点的content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录
  • 2.一字节长,值得最高位以11开头的是整数编码:这种编码表示节点的content属性保存着整数值,整数值的类型和长度由编码出去最高两位之后的其他位记录
    在这里插入图片描述
    在这里插入图片描述

content

节点的content属性负责保存节点的值,节点值可以是一个字节数组或者整数,值的类型和长度由节点的encoding属性决定。

例子

在这里插入图片描述
举个例子,图中展示了一个保存字节数组的节点示例

  • 1.编码的最高两位00表示节点保存的是一个字节数组
  • 2.编码的后六位001011记录了字节数组的长度11;
  • 3.content属性保存着节点值"hello world"

另一个例子。图中展示了一个保存整数值的节点示例

  • 1.编码11000000表示节点保存的是一个int16_t类型的整数值
  • 2.content属性保存着节点的值10086
    在这里插入图片描述

连锁更新

每个节点的previous_entry_length属性都记录了前一个节点的长度:

  • 1.如果前一节点的长度小于254字节,那么previous_entry_length属性需要用1字节长的空间来保存这个长度值
  • 2.如果前一节点的长度大于等于254字节,那么previous_entry_length属性需要用5字节长的空间来保存这个长度值现在,考虑这样一种情况:在一个压缩列表中,有多个连续的、长度介于250字节到253字节之间的节点e1至eN,如图所示。因为e1至eN的所有节点的长度都小于254字节,所以记录这些节点的长度只需要1字节长的previous_entry_length属性,换句话说,e1至eN的所有节点的previous_entry_length属性都是1字节长。这时,如果将一个长度大于等于254字节的新节点new设置为压缩列表的表头节点,那么new将称为e1的前置节点
    在这里插入图片描述
    在这里插入图片描述
    因为e1的previous_entry_length属性仅长1字节,它没有办法保存新节点new的长度,所以程序将对压缩列表执行空间重分配操作,并将e1节点的previous_entry_length属性从原来的1字节长扩展为5字节长。
    现在,麻烦的事情来了,e1原本的长度介于250字节至253字节之间,在为previous_entry_length属性新增四个字节的空间之后,e1的长度就变成了介于254字节至257字节之间,而这种长度使用1字节长的previous_entry_length属性是没法保存的。因此,为了让e2的previous_entry_length属性可以记录下e1的长度,程序需要再次对压缩列表执行空间重分配操作,并将e2节点的previous_entry_length属性从原来的1字节长扩展为5字节长.正如扩展e1引发对e2的扩展一样,扩展e2也会引发对e3的扩展,而扩展e3又会引发对e4的扩展…为了让每个节点的previous_entry_length属性都符合压缩列表对节点的要求,程序需要不断地对压缩列表执行空间重分配操作,直到eN为止
    在这里插入图片描述
    除了添加新节点可能会引发连锁更新之外,删除节点也可能会引发连锁更新
    在这里插入图片描述
    如图所示的压缩列表,如果e1至eN都是大小介于250字节至253字节的节点。big节点的长度大于等于254字节(需要5字节的previous_entry_length来保存),而small节点的长度小于254字节(只需要1字节的previous_entry_length来保存),那么当我们将small节点从压缩列表中删除之后,为了让e1的previous_entry_length属性可以记录big节点的长度,程序将扩展e1的空间,并由此引发之后的连锁更新。因为连锁更新在最坏情况下需要第压缩列表执行N次空间重分配操纵,而每次空间重分配的最坏复杂度为O(N),所以连锁更新的最坏复杂度为O(N^2).要注意的是,尽管连锁更新的复杂度较高,但它真正造成性能问题的几率是很低的:
  • 1,首先,压缩列表里要恰好有多个连续的,长度介于250字节至253字节之间的节点,连锁更新才有可能触发,在实际情况中,这种情况并不多见
  • 2.其次,即时出现连锁更新,但只要被更新的节点数量不多,就不会对性能造成任何影响:比如说,对三五个节点进行连锁更新是绝对不会影响性能的

因为以上原因,ziplistPush等命令的平均复杂度仅为O(N),在实际中,可以放心地使用这些函数,而不必担心连锁更新会
影响压缩列表的性能

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

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

相关文章

SwiftUI中的Sheet推出新页面

SwiftUI中的Sheet推出新页面 记录一下SwiftUI如何从下往上推出新的页面 import SwiftUIstruct SheetBootCamp: View {State var showSheet falsevar body: some View {ZStack{Color.green.ignoresSafeArea()Button(action: {showSheet.toggle()}, label: {/*START_MENU_TOKEN…

Linux chattr命令教程:如何改变文件或目录的属性(附案例详解和注意事项)

Linux chattr命令介绍 chattr命令是change file attributes on a Linux file system的缩写,主要用于改变文件或目录的属性。这个命令允许管理员控制谁可以修改文件或目录,或者在什么情况下可以修改。 Linux chattr命令适用的Linux版本 chattr命令在大…

攀拓(PAT)2024年春季 甲级题解

A-1 Braille Recognition 两层循环遍历&#xff0c;用数组计数 #include <bits/stdc.h> using namespace std; int a[10]; int main() {int n,m;cin>>n>>m;string s[110];for(int i0;i<n;i)cin>>s[i];for(int i0;i<n-2;i) {for(int j0;j<m-…

小迪安全39WEB 攻防-通用漏洞CSRFSSRF协议玩法内网探针漏洞利用

#知识点&#xff1a; 逻辑漏洞 1、CSRF-原理&危害&探针&利用等 2、SSRF-原理&危害&探针&利用等 3、CSRF&SSRF-黑盒下漏洞探针点 #详细点&#xff1a; CSRF 全称&#xff1a;Cross-site request forgery&#xff0c;即&#xff0c;跨站请求…

ThingsBoard开源物联网平台介绍

1. Thingsboard 简介 ThingsBoard是一个基于Java的开源物联网平台&#xff0c;旨在实现物联网项目的快速开发、管理和扩展。它使用行业标准的物联网协议&#xff08;MQTT、CoAP和HTTP&#xff09;实现设备连接&#xff0c;并支持云和本地部署。ThingsBoard结合了可扩展性、容错…

Springboot+vue的疫情居家办公系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的疫情居家办公系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

上海计算机学会 2023年11月月赛 丙组T5 推箱子(数学 思维 排序)

第五题&#xff1a;T5推箱子 标签&#xff1a;排序、数学、思维题意&#xff1a;给定 t t t组数据&#xff0c;每组数据给定长度为 n n n的字符串&#xff0c; 表示箱子&#xff0c; _ \_ _表示空格&#xff0c;求把箱子都推到一起&#xff08;即两两箱子之间没有空格&#…

Ubuntu18.04 安装搜狗输入法

一. 概述 自己的Ubuntu 18.04系统配置中文搜狗输入法&#xff0c;安装步骤&#xff0c;亲测可用 二. 安装步骤 2.1 确认系统版本和CPU架构 查看Ubuntu系统版本号&#xff0c;通过命令 lsb_release -a wuubuntume:~$ lsb_release -a No LSB modules are available. Distr…

安装Android Studio遇到Unable to access Android SDK add-on list的错误

第一次安装android studio的时候&#xff0c;提示&#xff1a;unable to access Android sdk add-on list 解决办法 这个错误一般是android studoi代理没有设置导致的&#xff0c;需要在setting里面设置&#xff1a; 点击Android Studio - Preferences&#xff0c;在 Appeara…

Linux中文件的权限

我们首先需要明白&#xff0c;权限 用户角色 文件的权限属性 一、拥有者、所属组和other&#xff08;用户角色&#xff09; 以文件file1为例 第一个箭头所指处即是文件的拥有者&#xff0c;拥有者为zz 第二个箭头所指处即使文件的所属组&#xff0c;所属组为zz 除去拥有者…

基于log4cpp封装日志类

一、log4cpp的使用 1. 下载log4cpp log4cpp官方下载地址 2. 安装log4cpp 第一步&#xff1a;解压 tar zxvf log4cpp-1.1.4.tar.gz 第二步&#xff1a;进入log4cpp文件夹并执行 ./configure tips&#xff1a;如果是ARM架构的CPU可能会失败&#xff0c;如下面这种情况&a…

Ubuntu查看ros版本-linux查看ros版本

使用ros带的rosversion命令即可查看自己的ros版本&#xff1a; rosversion -d

MATLAB算法实战应用案例精讲-【图像处理】边缘检测算子

目录 前言 数字图像处理基础知识与算法 1).数字图像 2).二值图像、灰度图像、彩色图像

如何在Windows中检测任何串行设备的COM端口?这里有一个应用程序

使用USB串行设备并不是最简单的工作流程。我们首先需要标识“设备管理器”下的COM端口,然后需要告诉应用程序使用该COM端口。 如果我们可以接收COM设备的自动通知,然后将它们配置为使用特定应用程序打开,该怎么办?Serial Port Notifier程序正是我们所需要的。 在最基本的级…

【Node.js从基础到高级运用】八、Express 框架入门

Express 框架入门 Express 是一个灵活且广泛使用的 Node.js web 应用框架&#xff0c;它提供了一系列强大特性来帮助开发者创建各种 Web 和移动设备应用。在这一节中&#xff0c;我们将介绍如何安装和配置 Express&#xff0c;并简单探讨其路由和中间件的概念。 安装 Express…

【计算机网络】UDP/TCP 协议

TCP 协议 一、传输层1. 再谈端口号2. 端口号范围划分3. 进程和端口号4. netstat5. pidof 二、UDP 协议1. UDP 协议端格式(报文)2. UDP 的特点3. 面向数据报4. UDP 的缓冲区 三、TCP 协议1. 认识 TCP2. TCP 协议段格式&#xff08;1&#xff09;4 位首部长度&#xff08;2&#…

爬蟲IP代理詳細指南

收集數據算是比較麻煩的任務&#xff0c;尤其是當數據量很大時。在網路抓取時暴露IP地址是常有的事&#xff0c;所以需要用到代理抓取工具&#xff0c;提供高效可靠的數據提取。 爬蟲IP代理抓取工具到底指什麼&#xff0c;以及如何在各種情況下使用它&#xff0c;比如說繞過地…

Spring Boot+Vue前后端分离项目如何部署到服务器

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

对话Shopify:平台工程如何帮助其自动化应对流量高峰

本文脱胎于 Obeservability Talk&#xff0c;完整内容请查看&#xff1a; https://www.youtube.com/watch?v6ShtsTTUizI 平台工程是近年来的热门话题。我们已经在 2023 年看到了开发人员们对它的追捧&#xff0c;预计在 2024 年后&#xff0c;我们也许会看到平台工程被广泛应用…

NVidia NX 中 ROS serial软件包的安装

自己装的ROS是noetic版本&#xff0c;受限于网络&#xff0c;直接用命令安装串口包不行。于是手动安装了一次。 1 下载源码 git clone https://github.com/wjwwood/serial.git 或者直接在浏览器里面输入 https://github.com/wjwwood/serial.git 2 解压 然后在serial&#xf…