【Redis】数据结构(下)

ops/2024/10/23 23:39:28/

文章目录

  • QuickList
    • 概念
    • `QuickList`结构
    • `QuickList`的特点
      • 控制`ZipList`的大小
      • 对节点的`ZipList`进行压缩
    • 总结
  • SkipList
    • 概念
    • 源码中结构分析
    • 总结

QuickList

概念

问题1:ZipList虽然节省内存,但是申请的内存必须是连续空间,如果内存占用过多,申请内存效率低,怎么办?

  1. 为了缓解这个问题,我们必须限制ZipList的长度和entry的大小
    问题2:但是我们要存储大量数据,超出了ZipList最佳上限应该怎么办?
  2. 我们可以创建多个ZipList来分片存储数据
    问题3:数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?
  3. 使用数据结构QuickList,他是一个双端链表,只不过链表中每个节点都是一个ZipList.

QuickList结构

在这里插入图片描述

QuickList的特点

控制ZipList的大小

为了避免QuickList中的每个ZipListentry过多,Redis提供了一个配置项:list-max-ziplist-size来限制

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

对节点的ZipList进行压缩

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

  • 0:特殊值,表示不压缩
  • 1:表示QuickList的首尾各有1个节点不压缩,中间节点压缩
  • 2:表示QuickList的首尾各有2个节点不压缩,中间节点压缩
  • 以此类推…
    注:Redis中,默认值为0

总结

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

SkipList

概念

ZipListQuickList都是从头到尾遍历或者从尾到头的遍历,所以随机查询的效率很低
SkipList(跳表)首先是链表,但是与传统的链表相比是有几点差异的:

  • 元素按照升序排列存储
  • 节点可能包含多个指针,且指针跨度不同.
    在这里插入图片描述

源码中结构分析

在这里插入图片描述
这里需要我们着重关注的几个设计:

  • zskiplistNode中设计的一个内部类level[](多级索引数组).
    • 在该多级索引数组中,会对索引的跨度和下一个节点的指针进行存储,也就是说,一个节点中,会根据不同的指针跨度,存放不同的下一个节点指针
    • score:节点分数,相当于一个索引,用于排序.不要误会数据存储在这里
      该数组中存储着不同等级的指针跨度
      在这里插入图片描述

总结

  1. 跳表是一个双向链表,每个节点都会包含一个score(用于排序)和ele(真实数据)值
  2. 节点按照score值排序,score值一样则按照ele字典进行排序
  3. 每个节点都可以包含多层指针,层数是1~32之间的随机数
  4. 不同层指针到下一个节点的跨度不同,层级越高,跨度越大
  5. 增删查改的效率和红黑树基本一致,实现却很简单

http://www.ppmy.cn/ops/127944.html

相关文章

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理,消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …

将图片转换为视频

方案一:使用Python和imageio库 介绍 Python是一种强大的编程语言,提供了多种库来处理图像和视频。imageio库是一个简单易用的库,可以轻松将图片序列转换为视频。 实现代码 import imageio import osdef images_to_video(image_folder, ou…

鸿蒙应用的Tabs 组件怎么使用

鸿蒙应用中的Tabs组件是一个用于通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。以下是Tabs组件的使用方法: 一、基本结构 Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabB…

StarTowerChain:开启去中心化创新篇章

官网: www.startower.fr 在当今创新驱动的时代,StarTowerChain 以其独特的去中心化创新模式,为我们带来了新的希望和机遇。去中心化,这个充满活力与创造力的理念,正引领着我们走向未来的创新之路。 StarTowerChain …

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…

概率论基本知识

随机变量及其分布 1.定义 随机变量是定义在样本空间上的实值函数&#xff0c;它将样本空间中的每一个样本点映射到一个实数上。通常用大写字母&#xff08;如X、Y&#xff09;表示随机变量&#xff0c;而小写字母&#xff08;如x、y&#xff09;表示随机变量的取值。他有两个…

深度解析RLS(Recursive Least Squares)算法

目录 一、引言二、RLS算法的基本思想三、RLS算法的数学推导四、RLS算法的特点五、RLS算法的应用场景六、RLS算法的局限性七、总结 一、引言 在自适应滤波领域&#xff0c;LMS&#xff08;Least Mean Squares&#xff09;算法因其计算简单、实现方便而广受欢迎。然而&#xff0…

汽车制造业JIT和JIS的简单区别

JIS&#xff1a;Just In Time 按时生产按时发货&#xff0c;是一种拉动式的生产方式&#xff0c;这种产品和零部件可以把他理解为一种通用的零部件&#xff0c;没有高低配置的区别。其核心在于确保零部件、原材料和组件能够精准地在生产线上所需之时抵达&#xff0c;避免提前堆…