首页 > 数据库 >redis数据结构

redis数据结构

时间:2023-04-22 18:00:22浏览次数:38  
标签:字节 redis ZipList QuickList 链表 entry 数据结构 节点

ZipList

ziplist是一种特殊的“双向链表”,由一系列特殊编码的连续内存组成,可以在任意一端进行压入和弹出。

ZipList的结构

image
image

ZipListEntry的结构

image
entry并不像普通双向链表节点用两个指针指向前后节点,为了节省空间。

  • previous_entry_length:前一个节点的长度,占1个或5个字节
    • 如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值
    • 如果前一节点的长度大于254字节,则采用5个字节来保存这个长度值,第一个字节为0xfe,后面四个字节才是真实长度数据
  • encoding:编码属性,记录content的数据类型(字符串还是整数)以及长度,占用1个、2个或5个字节
  • contents:负责保存节点的数据,可以是字符串或者整数

ZipList连锁更新问题

image
因为在第一个节点插入了一个254大小的entry,导致后面一个节点的previous_entry_lenghth从1字节变成5字节,导致这个节点也变成254字节大小,所以后面的节点都跟着变大。

QuickList

QuickList是一个双向链表,但是其中的每个节点是ZipList。
image
为了避免QuickList中的每个ZipList中的entry过多,redis提供了一个配置项:list-max-ziplist-size来限制。

  • 如果为正,则代表ZipList的允许的entry个数的最大值。
  • 如果为负,则代表ZipList的最大内存大小,分5种情况:
    1. -1:每个ZipList的内存占用不能超过4kb
    2. -2:每个ZipList的内存占用不能超过8kb
    3. -3:每个ZipList的内存占用不能超过16kb
    4. -4:每个ZipList的内存占用不能超过32kb
      其默认值为-2。

除了控制ZipList的大小,QuickList还可以对节点的ZipList做压缩。通过配置项list-compress-depth来控制。因为链表一般都是从首尾访问比较多,所以首尾是不压缩的。这个参数是控制首尾不压缩的节点个数:

  1. 0:特殊值,代表不压缩
  2. 1:标识QuickList的首尾各有1个节点不压缩,中间节点压缩
  3. 2:标识QuickList的首尾各有2个节点不压缩,中间节点压缩
  4. 依此类推

image

QuickList的特点

  • 是一个节点为ZipList的双端链表
  • 节点采用ZipList,解决了传统链表的内存占用问题
  • 控制了ZipList大小,解决连续内存空间申请效率问题
  • 中间节点可以压缩,进一步节省内存

标签:字节,redis,ZipList,QuickList,链表,entry,数据结构,节点
From: https://www.cnblogs.com/xiaoovo/p/17343114.html

相关文章

  • 【中级软件设计师】—(针对上午题)数据结构(二十九)
    【中级软件设计师】—(针对上午题)数据结构(二十九)一、查找平均查找长度二、顺序查找三、折半查找(二分查找)1234567......
  • redis高级:持久化方案、主从复制原理和方案、哨兵高可用
    目录一、持久化方案1、什么是持久化2、持久化的实现方式3、RDB4、aof方案5、RDB和AOF的选择6、混合持久化二、主从复制原理和方案1、为什么要用主从复制2、主从复制介绍3、redis主从赋值流程,原理三、哨兵高可用1、什么是高可用2、哨兵实现高可用3、哨兵实现高可用搭建步骤一、持......
  • redis高级:集群原理及搭建
    目录一、集群原理及搭建1、redis集群介绍2、数据库的多机数据分布方案节点取余分区介绍一致性哈希分区虚拟槽分区3、集群搭建4、集群扩容5、集群缩容一、集群原理及搭建当我们做了读写分离,做了哨兵高可用,还下列存在问题:并发量:单机redisqps为10w/s,但是我们可能需要百万级别的......
  • lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
    一、lua变量【全局变量和局部变量和表中的域】Lua变量有三种类型:全局变量和局部变量和表中的域。▪全局变量:默认情况下,Lua中所有的变量都是全局变量。▪局部变量:使用local显式声明在函数内的变量,以及函数的参数,都是局部变量。在函数外即使用local去声明,它的作用域也是当前的整......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之002 week01 02-02 线性查找法
    1、线性查找法什么是线性查找法?举例:在一沓试卷中,找到属于自己的那张试卷。第1张:不是第2张:不是第3张:不是……第n张:是,找到了!第n+1张:不找了……这个解决问题的思路和过程体现就是线性查找法的思想。2、线性查找法思路梳理线性查找法,就是在线性的数据结构中来完成。例如:在data数......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之001 week01 02-01 什么是算法?
    1、什么是算法?为了明确什么是算法,我们会从简单的查找功能开始讲起。查找其实一个一个非常简单的算法,但我们会为这个查找功能的算法做如下工作:让查找的功能适应更多的数据类型通过查找的例子讲解如何编写正确的程序?为查找算法性能测试对一些常见算法做复杂度分析2、定义算法Algorit......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之006 week01 02-06 循环不变量
    循环不变量1、循环开始时需要做什么?之前我们讲的线性查找法的核心代码如下:publicstatic<E>intsearch(E[]data,Etarget){for(inti=0;i<data.length;i++)if(data[i].equals(target))returni;return-1;}我们是否有思考过,这样一个......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之007 week01 02-07 简单的复杂度分析
    1、复杂度分析复杂度分析本身是非常理论化的一个内容,在计算机科学中,有一个专门的学科叫做——计算复杂性理论。很多童鞋看过《算法导论》,这本书的内容很多很强调算法导论。但是实际上,对于普通程序员来说,不需要过度强调理论化的内容。因为工作中更多面对的是实际的软件工程,工程化的......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之003 week01 02-03 代码实现线性查找
    1、算法描述在数组中逐个查找元素,即遍历。2、思路原理如算法描述,基本是最简单的代码块了,没有什么额外的原理。3、初步的代码实现线性查找法初步的代码实现:packagecom.mosesmin.datastructure.week01.chap02;/***@Misson&Goal代码以交朋友、传福音*@ClassNameLinearSearc......
  • 02-目录---数据结构与算法
    第01章:数组(即顺序表)的基本实现数组头文件定义:链接初始化、清空、销毁数组:链接输入元素创建数组、打印数组:链接数组扩容:链接在数组尾部追加若干元素:链接插入元素x:链接按位置删除元素:链接删除元素x:链接定位元素x:链接第02章:数组其他算法实现合并数组:链接1:链接2:链接3:链......