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

news/2024/8/22 3:28:40 标签: 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的主要区别


http://www.niftyadmin.cn/n/5556102.html

相关文章

IP风险画像 金融行业的安全盾牌

在当今数字化时代,金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展,欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息,防止各种形式的欺诈行为。 IP风险画像是…

【Docker】Docker 的数据管理与镜像创建

目录 一.数据管理 1.数据卷 2.数据卷容器 二.端口映射 三.容器互联 四.Docker 镜像的创建 1.基于现有镜像创建 1.1.首先启动一个镜像,基于镜像创建容器,更新容器内容 1.2.将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新…

uniapp 截取两条数据 进行页面翻页滚动

// 轮播信息 <view class"sales_list" ><view class"sales_item" v-for"(item,index) in sellDisplayList" :key"index" click"salesFn(item)"><image :src"item.goodsImg"></image><…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】 Message Queue 消息队列异步处理应用解耦流量控制 消息中间件概念RabbitMQ概念MessagePublisherExchangeQueueBindingConnectionChannelConsumerVirtual HostBroker图…

实验六:频域图像增强方法

一、实验目的 熟练掌握频域滤波增强的各类滤波器的原理及实现。分析不同用途的滤波器对频域滤波增强效果的影响,并分析不同的滤波器截止频率对频域滤波增强效果的影响。二、实验原理 ① Butterworth 低通滤波器:一种具有最大平坦通带幅度响应的滤波器。它的特点是在通带内具…

python+pygame实现五子棋网络对战之二

上篇我们对python的Socket编程有了一个基本的认识&#xff0c;接下来就可以完成五子棋的网络对战的实现。步骤如下&#xff1a; 1、服务端开始侦听 2、客户端通过tcp连接上服务端&#xff0c;开局 3、判断输赢后&#xff0c;一方提出是否开新局 4、对方同意后&#xff0c;开…

数据的力量:Facebook如何通过数据分析驱动创新

在当今数字化和信息化的时代&#xff0c;数据被认为是推动企业创新和发展的关键因素之一。作为全球最大的社交媒体平台&#xff0c;Facebook不仅积累了庞大的用户数据&#xff0c;还利用先进的数据分析技术&#xff0c;不断探索和实现新的创新。本文将深入探讨Facebook如何通过…

如何构建全生命周期的安全体系架构来确保容器的安全?

容器技术在云原生应用和微服务架构中得到了广泛应用&#xff0c;其轻量、灵活和高效的特点使其成为现代IT环境中的重要工具。然而&#xff0c;尽管容器带来了许多优势&#xff0c;但其安全性问题也不容忽视。接下来跟随博主一起探索如何构建全生命周期的安全体系架构以确保容器…