redis原理之底层数据结构(二)-压缩列表

1.绪论

压缩列表是redis最底层的结构之一,比如redis中的hash,list在某些场景下使用的都是压缩列表。接下来就让我们看看压缩列表结构究竟是怎样的。

2.ziplist

2.1 ziplist的组成

在低版本中压缩列表是由ziplist实现的,我们来看看他的结构

可以看出压缩列表由如下几个字段组成:
1.zlbytes:4个字节的总长度;
2.zltail: 4个字节最后一个元素的指针;
3.zllen:2个字节总的元素个数;
4.多个entry元素;
5.zlend:压缩列表的结尾标志。

每个entry元素由3部分组:
1.previous_entry_length:1个字节或者5个字节,上一个entry的长度,当上一个元素大小小于255个自己,当前字段为1个字节,当超过255个字节,当前字段为5个字节;
2.encoding:通过1个字节,用来表示存储的内容是什么类型,比如int16或者int32,或者是字符串数组;
3.content:真正存储的内容数据,如果是存储的字符串,会存储字符串的长度和内容。

2.2 ziplist的缺点

2.2.1 连锁更新

ziplist为了解决从节点后向前遍历的问题,所以每个entry都存储了前一个节点的长度previous_entry_length,而redis一直秉持着对节约内存的优秀品质,如果前一个节点的数量小于255个字节,就用1个字节来存储长度,但是大于的话就用5个字节来存储长度。现在假设ziplist有5个entry,而且刚好5个entry的长度254,刚好每个previous_entry_length都是一个字节来存储长度,现在假设第一个entry加了一些数据,导致长度,大于了255个字节,第二个元素的previous_entry_length需要用5个字节来存储前一个元素的长度,导致第二个entry的总长度也增加了,并且超过了255个字节,所以第3个元素的previous_entry_length也需要用5个字节存储上一个元素的长度,依此类推,修改一个元素的内容,需要修改后面所有的元素。这就是连锁更新。

3.listpack

在高版本的redis中,为了解决连锁更新问题,redis采用listpack来实现压缩列表。listpack和ziplist差不多,但是有个区别就是每个entry记录的是本entry的长度,而不是上一个entry的长度,所以每个entry长度的改变只会影响自己,而不会影响到其他的entry。

3.1 listpack的组成


1.tot-bytes:4个字节的总长度
2.num-elements:entry的总个数
3.多个entry
4.end-bytes:1个字节的结束标识


每个entry由3部分组成:
1.encoding:1个字节,用来标识content存储的内容的编码,整数或者字符串
2.content:每个entry存储的内容
3.back-len:当前entry的长度,这是和ziplist的主要区别

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

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

相关文章

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】

项目场景: 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时,会发现这个文件下载的默认保存位置和我们预想的不太一样,容易找不到,而且没有提示,那么我们就需要把文件打开自己保存并且有提示保存到哪个…

fastadmin导入vue

前台 require-frontend.js或frontend-init.js 后台 require-backend.js或backend-init.js 后台 方法一 require-backend.js 在 paths 中加入’vue’:‘…/libs/vue/vue.min’, 在shim 中加入 paths: {............vue:../libs/vue/vue.min, } shim: {............vue: {ex…

acrobat 中 PDF 复制时不能精确选中所选内容所在行的一种解决方法

现象:划取行的时候,自动扩展为多行 如果整段选中复制,粘贴后是乱码 解决步骤 识别完,保存 验证 可以按行复制了。 如果遇到仅使用 acrobat OCR 不能彻底解决的,更换其他自己熟悉的进行 OCR。

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 事件传参 (以下为错误示例) 3.事件传参与数据同步 4.条件渲染 …

three.js创建基础模型

场景是一个三维空间,是所有物品的容器。可以将其想象成一个空房间,里面可以放置要呈现的物体、相机、光源等。 通过new THREE.Scene()来创建一个新的场景。 /**1. 创建场景 -- 放置物体对象的环境*/ const scene new THREE.Scene();场景只是一个三维的…

如何安装node.js

Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。 主要特点和优势: 非阻塞 I/O 和事件驱动:能够高效处理大量并发连接,非常适合构建高并发的网络应用,如 Web 服务器、实时聊天应用等。 例如,在…

电脑远程开关机

1. 远程开机 参考:https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒(需要主板支持,一般都支持) 要使用远程唤醒,有几种方式:使用类似向日葵开机棒(很贵)、公网ip&…

车载音视频MediaPlayer优化方案

媒体播放现状 从手机到车载,在很多地方还是有很大的不同。针对多媒体的场景Android车机目前大部分结构大致结构如下图: 从以上图看出的问题: 各个音视频APP单独实现播控界面,播放链路不一致,使用的底层播放器和音频焦…

书生大模型实战入门:Git

任务1: 破冰活动:自我介绍 任务2: 实践项目:构建个人项目 任务1: 破冰活动:自我介绍 VSCODE下载Git插件: 打开Github:https://github.com/InternLM/Tutorial,新建分支(Fork) 创建后…

在VS2017下FFmpeg+SDL编写最简单的视频播放器

1.下载ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下,并设置调试命令 5.复制一下mp4视频到工程Debug目录下(复制一份到*.vcxproj同一目录,用于调试) 6…

Spring MVC入门5

你能学到什么 获取header的两种方式学习Spring MVC的第三部分 “ 响应 ” 返回静态页面返回HTML代码返回JSON设置状态码 正文 获取header 获取Header也是从 HttpServletRequest 中获取 再举个例子 获取header的简洁方法(RequestHeader) Reques…

rtf是什么格式的文件?rtf格式和word的区别是什么?

RTF是什么格式的文件? RTF(富文本格式,Rich Text Format)和Word文档(以.doc和.docx为扩展名的Microsoft Word文档)是两种常用的文本文件格式。它们在文件结构、兼容性、功能和使用场景等方面存在一些显著差异。 比如…

macOS Sequoia 15(Macos15系统)v15.0 Beta 3发布 macOS Sequoia 15 功能预览

macOS Sequoia 15 功能预览 犀利一如 Mac macOS Sequoia 15(Macos15系统)v15.0 Beta 3测试版本下载安装 连续互通 你的 Mac 上,iPhone 用起来。 有了 iPhone 镜像功能,在 Mac 上就能看到 iPhone 屏幕画面,还能直接进行操控,不拿…

网络安全——防御(防火墙)带宽以及双机热备实验

12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 13,办公区上网用户限制流量不超过100M,其中销售部人员在其…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

使用Copilot 高效开发繁忙的一天

在现代软件开发的世界里,使用AI工具如GitHub Copilot可以显著提高开发效率。 早晨:规划与启动 7:00 AM - 起床与准备 开发者早早起床,享用健康的早餐,并浏览新闻和技术博客,了解最新的科技动态。快速整理思路&#x…

iredmail服务器安装步骤详解!如何做配置?

iredmail服务器安全性设置指南?怎么升级邮件服务器? iredmail是一个功能强大的邮件服务器解决方案,它集成了多个开源软件,使您能够快速部署和管理邮件服务。AokSend将逐步引导您完成安装过程,无需深入的编程知识即可轻…

Uniapp自定义动态加载组件(2024.7更新)

1.本次介绍如何使用uniapp实现自定义动态加载Loading的组件,可以gif格式,也可以mp4格式等; 编写自定义Loading组件(CustomLoader.vue);组件中含有“动态接收图片路径”,“10秒超时未false则自动断开关闭Loading”;在全…

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习(二)工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…

三级_网络技术_17_交换机及其配置

1.下面是一台三层交换机的部分路由表信息。根据表中的路由信息,以下描述错误的是()。 此设备启用了OSPF动态路由协议,并学到了E1和E2两种类型的OSPF外部路由 比设备通过动态路由协议得到缺省路由,下一跳是设备的TenGigabitEthernet1/15接口 …