Redis源码篇 - Ziplist数据结构

Ziplist是一种内存优化的list存储结构,通过使用连续的内存空间存储,来减少内存碎片化,同时和链表的不同还有,它不存储前后指针,而是通过变长的字节存储前节点元素长度,通过计算长度来实现节点的查找。它是一种以时间换空间的数据结构

普通的链表中节都存储着前后指针,分别指向上一个节点和下一个节点,节点在内存不是顺序存储的,所以会造成内存碎片化。

ziplist就是通过申请连续的内存空间来实现链表的功能,结构如下:

 ziplist中,记录了zlail尾部指针偏移量,是为了可以通过其快速定位到尾部entry,实现方向索引。

 prevlen:上一个entry大小(1字节或者5字节),可以通过该长度计算来移动指针实现元素遍历查找。prevlen是一个边长字节:

  • 当前entry元素大小在1~253字节时,prevlen使用1个节点来存储。
  • 当前entry元素>= 254字节时,prevlen使用5个节点来存储,此时前一个1个字节固定为254最为标记,表示后面4个字节存储大真正数据。

   (之所以取254,是因为zlend固定为255,用来表示结尾)

encoding:encoding存储了元素内容的类型编码信息(数值或者字符串)以及长度 (1、2、5字节),ziplist通过这个字段来决定后面的content的形式 。 当encoding最高的2位为11是,说明是数字,否则是字符串。
当数值类型在0~12范围内,则存储在encoding中,此时忽略entry-data。

和linklist相对比为什么会节省空间?

  • ziplist通过申请连续内存空间存储,减少了内存碎片化。
  • 内存不需要维护前后指针,节省了空间,而是通过len的计算偏移量,从而移动指针实现遍历查询。
  • 同时redis对其做了相对优化,比如边长的prevlen,当前entry在254以内时,使用1个字节存储,超过时使用5个字节存储。

缺点?

  • 压缩列表通过申请连续的内存空间存储,节省空间,这是它优点,同时也是它缺点,因为当数据量越来越大时,并不能保证能申请到大的连续的内存空间,查询性能也会下降(O(n)),所以一般当数据量达到一定程度时,需要转成其他存储结构。比如quicklist、hash等。

压缩链表中连锁更新问题

 通过上面的介绍,了解到entry中pervious_entry_length会使用1或者5字节来存储上一个entry长度:

  • 如果前一个节点长度小于254时,则使用1个字节来保存长度。
  • 如果前一个节点长度>= 254时,使用5个字节来保持长度,其中前1个字节固定为0xfe,后4和字节才是真正的长度数据。

压缩链表中连锁更新场景

如果,有N个连续的、长度为250~253字节之间entry,此时他们的prevlen都是1个字节存储前一个节点长度,如下:

 此时插入了一个大于或等于254字节元素A:

此时发现因为A是超过了254字节,所以B需要申请空间使用5个字节的prevlen保存A长度:

 当B完成空间申请之后,B的内存空间就是254了,因为多申请了4个字节,此时C又需要使用5字节prevlen来存储,需要申请空间。

总结压缩链表中entry使用边长prevlen记录上一个entry长度,当存在连续的、长度为250~253之间的entry时,此时发生新增、删除新的大于254数据时,会导致连续空间扩张操作称之为连锁更新Redis并没有对此进行处理,因为概率比较低。

Ziplist特性:

  • 压缩列表可以看成一种连续空间的”双线链表“。
  • 列表节点之间不是通过指针连接,而是记录上一个节点和本节点长度来寻址,内存占用低。
  • 如果列表数据过多,导致列表过程,可能影响查询性能,因为和链表一样都需要O(n)的查询效率。
  • 增或者删除数据时,可能发生连锁更新问题。

 图地址:

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

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

相关文章

Google 登录支付,Firebase 相关设置

登录sdk: https://developers.google.com/identity/sign-in/android/start?hlzh-cn 支付sdk: https://developers.google.com/pay/api/android/overview?hlzh-cn Firebase sdk: https://firebase.google.com/docs/android/setup?hlzh-cn 登录设置: 创建凭据&…

机器学习-线性代数-5-空间中的向量投影与最小二乘法

空间中的向量投影与最小二乘法 文章目录 空间中的向量投影与最小二乘法一、引入二、投影和投影的描述1、投影描述最近2、利用矩阵描述投影(1)向一维直线投影(2)向二维平面投影(3)向n维子空间投影的一般情况 三、最小二乘法1、重要的子空间(1)互补的子空间(2)正交的子空间(3)相互…

12.面板问题

面板问题 html部分 <h1>Lorem ipsum dolor sit, amet consectetur adipisicing.</h1><div class"container"><div class"faq"><div class"title-box"><h3 class"title">Lorem, ipsum dolor.<…

(转载)神经网络遗传算法函数极值寻优(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;makefile是一个文件&#xff0c;当前目录下的文件&#xff0c;两者搭配使用&#xff0c;完成项…

数据预处理matlab

matlab数据的获取、预处理、统计、可视化、降维 数据的预处理 - MATLAB & Simulink - MathWorks 中国https://ww2.mathworks.cn/help/matlab/preprocessing-data.html 一、数据的获取 1.1 从Excel中获取 使用readtable() 例1&#xff1a; 使用spreadsheetImportOption…

【AutoSAR 架构介绍】

AutoSAR简介 AUTOSAR是Automotive Open System Architecture&#xff08;汽车开放系统架构&#xff09;的首字母缩写&#xff0c;是一家致力于制定汽车电子软件标准的联盟。 AUTOSAR是由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立&#xff0c;各成…

npm link 实现全局运行package.json中的指令

packages.json "name":"testcli","bin": {"itRun": "index.js"},执行命令 npm link如果要解绑定 npm unlink testcli 现在你可以输入 itRun试一下

MySQL高阶语句之二

目录 一、子查询 1.1语法 1.2select 1.3insert 1.3update 1.4delete 1.5 exists 1.6别名as 二、MySQL视图 2.1功能 2.2区别 2.3联系 2.4 创建视图(单表) 2.5 创建视图(多表) 2.6修改原表数据 2.7修改视图数据 三、NULL值 四、连接查询 4.1内连接 4.1.1语法 4.1.…

LangChain+LLM大模型问答能力搭建与思考

1. 背景 最近&#xff0c;大模型&#xff08;LLMs&#xff0c;Large Language Models&#xff09;可谓是NLP领域&#xff0c;甚至整个科技领域最火热的技术了。凑巧的是&#xff0c;我本人恰好就是NLP算法工程师&#xff0c;面临着被LLMs浪潮淘汰的窘境&#xff0c;决定在焦虑…

配置jenkins 服务器与目标服务器自动化部署

在配置完远程构建后可以通过添加post-build step 执行shell脚本的方式将包传到远程服务器等一系列操作。 通过scp传输打包好的项目到目标服务器 按照链接 方式配置免密操作&#xff0c;需要注意的是要在jenkins 用户目录下配置生成私钥密钥&#xff0c;配置jenkins 的免密&…

我的踩坑记录!!!积累中......

bug记录&#xff1a; 解决 nodejs安装后&#xff0c;在安装目录下【nodejs】创建两个文件夹【node_global】及【node_cache】用来配置全局环境变量。 之后&#xff0c;打开cmd命令窗口&#xff0c;输入 npm config set prefix ”D:\Program Files\nodejs\node_global” npm con…

YOLO-V5分类实战系列 —— 调优自己的数据集+RK1808部署

YOLO-V5分类实战系列 —— 调优自己的数据集 1、保存训练和测试图片2、数据归一化3、数据增强3.1、数据增强库&#xff1a;albumentations3.2、数据增强库&#xff1a;torchvision 4、ONNX CPU 推理4.1、Pt 模型转为 ONNX4.2、ONNX 推理验证4.3、 ONNX CPU推理&#xff08;C&am…

蓝桥杯专题-真题版含答案-【生命之树】【消除尾一】【密码脱落】【生日蜡烛】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

使用GGML和LangChain在CPU上运行量化的llama2

Meta AI 在本周二发布了最新一代开源大模型 Llama 2。对比于今年 2 月发布的 Llama 1&#xff0c;训练所用的 token 翻了一倍&#xff0c;已经达到了 2 万亿&#xff0c;对于使用大模型最重要的上下文长度限制&#xff0c;Llama 2 也翻了一倍。 在本文&#xff0c;我们将紧跟趋…

回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-LSTM时间卷积神经网络结合长…

pytorch学习——第二个模型(逻辑回归)

参考该博客系统学习Pytorch笔记二&#xff1a;Pytorch的动态图、自动求导及逻辑回归 c l a s s { 0 0.5 > y 1 0.5 ≤ y class\left\{ \begin{array}{rcl} 0 & & {0.5 > y}\\ 1 & & {0.5 \le y}\\ \end{array} \right. class{01​​0.5>y0.5≤y​ 根…

伦敦金投资仓位控制的方法

留意本栏目过去的文章的朋友都会发现&#xff0c;其实小编认为资金管理很重要&#xff0c;甚至重要性超过技术分析找到入场机会。在资金管理中&#xff0c;关于仓位的控制是一门很大的学问&#xff0c;在伦敦金投资中&#xff0c;仓位的控制关系到我们盈亏的多少&#xff0c;甚…

数据仓库设计理论

数据仓库设计理论 一、数据仓库基本概念 1.1、数据仓库介绍 数据仓库是一个用于集成、存储和分析大量结构化和非结构化数据的中心化数据存储系统。它旨在支持企业的决策制定和业务分析活动。 1.2、基本特征 主题导向&#xff1a;数据仓库围绕特定的主题或业务领域进行建模…

探索物联网HMI的端口转发和NAT功能

前言 端口转发和NAT功能常用于内网穿透&#xff0c;实现内部网络和外部网络之间的数据传输&#xff0c;工作人员通过外部网络便可安全访问到内网设备&#xff0c;实现设备的状态监测。接下来小编将为大家介绍支持端口转发和NAT功能的虹科物联网HMI是如何帮助用户实现内网穿透。…