首页
学习
活动
专区
圈层
工具
发布

Redis的压缩列表中删除节点和扩容的操作

图片删除操作在Redis的压缩列表中,当节点被删除后,并不会立即释放该节点所占用的内存空间。这是因为压缩列表的设计目的是在保持高效的内存使用的同时,尽可能地减少内存的分配和回收频率,从而提高性能。...扩容操作Redis在处理压缩列表的扩容操作时,会首先判断压缩列表的节点数是否超过了设定的最大节点数(默认为8个节点)。...如果节点数超过了最大节点数,Redis会将压缩列表转换为普通列表(正常的双向链表)。在进行转换时,Redis会为每个节点分配一个新的列表节点,然后将压缩列表的节点数据迁移至新的列表节点中。...因此,在进行压缩列表扩容操作时,可能会导致Redis的阻塞现象,对系统的响应性能造成影响。由于压缩列表的扩容操作可能导致数据迁移,可以考虑在业务低峰期进行操作,以减少对系统性能的影响。...此外,对于需要频繁扩容操作的场景,可以考虑使用Redis的普通列表结构,以避免压缩列表的转换过程带来的性能问题。

72041

Redis之压缩列表ziplist

当然是为了节省内存空间 我们先来看看ziplist是如何压缩的 原理 整体布局 ziplist是由一系列特殊编码的连续内存块组成的顺序存储结构,类似于数组,ziplist在内存中是连续存储的,但是不同于数组...ziplist将一些必要的偏移量信息记录在了每一个节点里,使之能跳到上一个节点或下一个节点。...: 当前节点的编码规则,下文会详细说 data: 当前节点的值,可以是数字或字符串 为了节省内存,根据上一个节点的长度prevlength 可以将ziplist节点分为两类: entry的前8位小于...根据当前节点存储的数据类型及长度,可以将ziplist节点分为9类: 其中整数节点分为6类: 整数节点的encoding的长度为8位,其中高2位用来区分整数节点和字符串节点(高2位为11时是整数节点...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127070.html原文链接:https://javaforall.cn

80911
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    压缩列表的源码实现

    Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。当有序集合或散列表的元素个数比较少,且元素都是短字符串时,Redis便使用压缩列表作为其底层数据存储结构。...列表使用快速链表(quicklist)数据结构存储,而快速链表就是双向链表与压缩列表的组合。 ziplist 压缩列表是一个特殊编码的双端链表(内存上连续),为了尽可能节省内存而设计的。...在 7.0 版本里,ziplist 已经全面被 listpack 替换了(主要是因为连锁更新较影响性能) 压缩列表的存储结构 Redis使用字节数组表示一个压缩列表,压缩列表结构如下所示: <zlbytes...元素的存储结构 压缩列表元素的存储结构如下所示: 每一个 ziplist entry 压缩列表节点在实际的节点数据之前都会包含两部分元数据...: 存储当前节点的数据编码格式 p: 指向当前节点开头第一个字节的指针 函数zipEntry用来解码压缩列表的元素,填充为zlentry结构体。

    59640

    Redis压缩列表和跳表

    Redis 的压缩列表(ziplist)和跳表(skiplist)是两种不同的数据结构,它们在 Redis 中被用于实现不同的功能。压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。...和数组不同的是,压缩列表在表头有三个字段zlbytes、zltail和zllen,分别表示列表长度、列表尾的偏移量和列表中的entry个数;压缩列表在表尾还有一个zlend,表示列表结束。...压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。...和数组不同的是,压缩列表在表头有三个字段zlbytes、zltail和zllen,分别表示列表长度、列表尾的偏移量和列表中的entry个数;压缩列表在表尾还有一个zlend,表示列表结束。...总之,压缩列表和跳表是两种不同的数据结构,它们在 Redis 中被用于实现不同的功能。压缩列表用于存储短的列表或集合,而跳表用于实现可以在对数时间内进行搜索、插入和删除操作的有序集合。

    1.1K10

    Redis源码学习之压缩列表

    压缩列表是列表对象、哈希对象和有序集合对象的底层实现之一。以列表对象为例,当列表节点都是比较小的整数或者比较短的字符串的时候,Redis就会选择压缩列表来做底层实现。...其实,压缩列表就是一个字节数组,我们知道,在虚拟存储器中以连续的形式存放数据,可以避免产生内存碎片,提高存储器利用率,而压缩列表正是因此而设计的。...压缩列表的实现 1.数据结构 前文中提到,压缩列表就是一块连续的内存空间,是一个字节数组。...前4个字节分配给zlbytes,表示整个压缩列表所占字节数(空列表就是11) 接着4个字节分配给zltail,表示从压缩列表第一个字节距离表尾节点的字节数(空列表是10) 两个字节分配给zllen...所以这也是为什么压缩列表更适合存储数值较小的节点了。

    65500

    Redis压缩列表原理与应用分析

    zltail:存储一个无符号整数,固定四个字节长度,代表指向列表尾部的偏移量,偏移量是指压缩列表的起始位置到指定列表节点的起始位置的距离。...zllen:压缩列表包含的节点个数,固定两个字节长度,源码中指出当节点个数大于2^16-2个数的时候,该值将无效,此时需要遍历列表来计算列表节点的个数。...列表元素编码 上面介绍了压缩列表的总体内存布局,对于初entryX区域以外的四个区域的长度都是固定的,下面再看看entryX区域的编码情况。 每个列表节点由三部分组成: ?...压缩列表节点编码示意图 每个压缩列表节点区域头部包含两部分,一部分叫做previous length,另一部分叫encoding,最后是主体内容,叫做content,下面分别介绍他们: previous...length 用于存储上一个节点的长度,因此压缩列表可以从尾部向头部遍历,即当前节点位置减去上一个节点的长度即得到上一个节点的起始位置。

    1.3K41

    Redis源码剖析之压缩列表(ziplist)

    其他API 具体API定义列表见源码ziplist.h unsigned char *ziplistNew(void); // 新建ziplist unsigned char *ziplistMerge...(unsigned char *zl, unsigned char *p); // 找到p节点的下一个节点 unsigned char *ziplistPrev(unsigned char *zl,...unsigned char *p); // 找到p节点的前一个节点 unsigned int ziplistGet(unsigned char *p, unsigned char **sval,...*zl); // ziplist的存储空间大小 void ziplistRepr(unsigned char *zl); // 结语 ziplist其实是一个逻辑上的双向链表,可以快速找到头节点和尾节点...,然后每个节点(entry)中也包含指向前/后节点的"指针",但作者为了将内存节省到极致,摒弃了传统的链表设计(前后指针需要16字节的空间,而且会导致内存碎片化严重),设计出了内存非常紧凑的存储格式。

    74310

    【Redis】三、Redis整数集合和压缩列表

    zllen: 压缩列表包含的节点个数,固定两个字节长度,源码中指出当节点个数大于2^16-2个数的时候,该值将无效,此时需要遍历列表来计算列表节点的个数。...列表节点 上面介绍了压缩列表的总体内存布局,对于初entryX区域以外的四个区域的长度都是固定的,下面再看看entryX区域的编码情况。 每个列表节点由三部分组成: ?...,因此压缩列表可以从尾部向头部遍历,即当前节点位置减去上一个节点的长度即得到上一个节点的起始位置。...为啥要使用压缩列表 使用压缩列表的好处除了节约内存之外,还有减少内存碎片的作用,我把这种行为叫做"合并存储",也就是将很多小的数据块存储在一个比较大的内存区域 压缩列表的问题 添加新节点到压缩列表...,或者从压缩列表中删除节点,可能会引发连锁更新操作,但这种操作出现的几率不高

    63030

    Redis 源码简洁剖析 05 - ziplist 压缩列表

    创建新 ziplist 将节点添加到末端 将节点添加到某个/某些节点的前面 删除节点 参考链接 Redis 源码简洁剖析系列 ziplist 是什么 压缩列表,内存紧凑的数据结构,占用一块连续的内存空间...哈希键 列表键 有序集合键 ziplist 特点 优点 节省内存 缺点 不能保存过多的元素,否则访问性能会下降 不能保存过大的元素,否则容易导致内存重新分配,甚至引起连锁更新 ziplist 数据结构...将节点添加到某个/某些节点的前面:在这种情况下,新节点的后面有至少一个节点。 以下两个小节分别讨论这两种情况。...参考链接 《Redis 设计与实现》- 压缩列表 Redis 源码简洁剖析系列 最简洁的 Redis 源码剖析系列文章 Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~...原创不易,希望大家转载时请先联系我,并标注原文链接。

    58230

    6、Redis数据结构——压缩列表-ziplist

    压缩列表 压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么是小整数值,要么是长度比较短的字符串,那么redis就会使用压缩列表来作为列表键的底层实现。...压缩列表构成 struct ziplist{ // 整个压缩列表占用字节数 int32 zlbytes; // 最后一个节点到压缩列表起始位置的偏移量,可以用来快速的定位到压缩列表中的最后一个元素...属性以字节为单位,记录了压缩列表中前一个节点的长度。...压缩列表的从表尾向表头遍历操作就是使用这一原理实现的,只要我们拥有了一个指向某个节点起始地址的指针,程序就可以一直向前一个节点回溯,最终到达压缩列表的表头节点。...压缩列表是一种为节约内存开发的顺序型数据结构。 压缩列表被用作列表键和哈希键的底层实现之一。 压缩列表可以包含多个节点,每个节点可以包含一个字节数组或整数值。

    98500

    Redis的设计与实现(6)-压缩列表

    _t 4 字节 记录整个压缩列表占用的内存字节数: 在对压缩列表进行内存重分配, 或者计算 zlend 的位置时使用. zltail uint32_t 4 字节 记录压缩列表表尾节点距离压缩列表的起始地址有多少字节..., 这个属性的值就是压缩列表包含节点的数量; 当这个值等于 UINT16_MAX 时, 节点的真实数量需要遍历整个压 缩列表才能计算得出. entryX 列表节点 不定 压缩列表包含的各个节点,节点的长度由节点保存的内容决定...压缩列表 API 函数 作用 算法复杂度 ziplistNew 创建一个新的压缩列表。 O(1) ziplistPush 创建一个包含给定值的新节点, 并将这个新节点添加到压缩列表的表头或者表尾。...总结 压缩列表是一种为节约内存而开发的顺序型数据结构. 压缩列表被用作列表键和哈希键的底层实现之一. 压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值....添加新节点到压缩列表, 或者从压缩列表中删除节点, 可能会引发连锁更新操作, 但这种操作出现的几率并不高.

    30900

    走近源码:压缩列表是怎样炼成的

    而Redis对于内存的节约可以说是费尽心思,今天我就再来介绍一种Redis为了节约内存而创造的存储结构——压缩列表(ziplist)。...这个函数中判断了zset对象的编码方式,对压缩列表ziplist和跳跃列表skiplist分开处理,跳跃列表是zset的另一种编码方式,这个我们以后再介绍,本文我们只关注ziplist。...接下来就到了ziplist.c文件中,真正向压缩列表中插入元素了。关键代码在__ziplistInsert()函数中。 首先需要计算插入位置前一个元素的长度,存储到当前entry的prevlen。...而如果我们删除了entry2,那么entry3的prevlen就需要扩展到5个字节,这一操作就有可能引起级联更新,后面的情况和新增节点时一样。...总结 最后做一个总结: 压缩列表是zset和hash元素个数较少时的存储结构 ziplist由zlbytes、zltail、zllen、entry、zlend这五部分组成 每个entry由prevlen

    70340
    领券