redis 跳跃表、字典、压缩列表、快速列表

news2025/2/1 14:02:34

redis 跳跃表、字典、压缩列表、快速列表

1. 跳跃表

在这里插入图片描述

​ 跳跃表是有序集合的底层实现。就是将有序集合的部分节点进行分层。每一层都是有序集合,并且层次越高,节点数量就越少。最底层的包含所有节点数据。典型的空间换时间。

​ Redis中的跳跃表(Skip List)是一种数据结构,用于实现有序集合(Sorted Set)。它是一种有序的、分层的链表结构,可以提供快速的插入、删除和查找操作。

​ 跳跃表通过在链表中添加多级索引来加速查找操作,使得在有序集合中的元素可以更快地被定位。每一级索引称为一个层,具有一定的间隔。跳跃表中的每个节点包含了一个值和多个指针,指向下一级的节点。

​ 跳跃表的插入、删除和查找操作都具有较好的平均时间复杂度,接近于O(log N),其中N是有序集合的元素数量。相比于传统的有序链表或平衡二叉树,跳跃表的实现更加简单,且具有较好的性能。

​ 在Redis中,跳跃表主要用于实现有序集合数据类型,通过跳跃表可以高效地支持元素的按照分数(score)进行排序和检索。跳跃表中的每个节点都包含一个元素的值和分数,元素按照分数进行有序存储。跳跃表还支持按照索引范围获取一定区间的元素,如获取分数在指定范围内的元素。

​ 需要注意的是,跳跃表在插入和删除操作时,可能会进行索引调整和层级重构的操作,以保持跳跃表的平衡性和性能。这些操作在维护有序集合时是透明执行的,对用户来说是不可见的。

空间换时间

​ 跳跃表通过在链表中添加多级索引来提高查找的效率,从而牺牲了一定的空间复杂度以换取更快的查询速度。通过添加索引层,跳跃表可以跳过一些节点,直接到达目标节点的附近,从而减少了查找的时间复杂度。

​ 在跳跃表中,节点的数量和索引层数量之间存在着平衡。更多的索引层可以提高查找的效率,但会增加索引层的空间占用。因此,跳跃表的空间复杂度会随着索引层数的增加而增加,但相对于传统的有序链表或平衡树结构,跳跃表的空间占用仍然相对较小。

​ 通过空间换时间的策略,跳跃表可以在较低的时间复杂度内实现插入、删除和查找操作。它在大多数情况下能够提供接近O(log N)的平均时间复杂度,其中N是元素的数量。这使得跳跃表成为一种高效的有序集合实现方式。

​ 需要注意的是,跳跃表的空间复杂度O(n)可能会比其他数据结构稍高,特别是当需要添加大量索引层时。因此,在应用中选择使用跳跃表时,需要根据具体的需求和资源限制进行权衡和评估。

跳跃表的随机函数

跳跃表中的随机函数用于决定节点是否升级到更高层级的索引,以平衡跳跃表的结构和提高查询效率。

​ 在跳跃表(Skip List)中,随机函数用于决定节点是否升级到更高层级的索引。跳跃表的多级索引结构是通过层级之间的指针链接实现的,而随机函数的作用是控制节点在哪些层级上存在索引。

​ 具体来说,随机函数在插入新节点时被用来决定节点是否升级到更高层级。当新节点被插入到跳跃表中时,根据设定的概率阈值,随机函数生成一个随机数。如果随机数满足升级条件,即在概率阈值内,那么新节点将被插入到更高层级的索引中。

​ 通过随机函数来决定节点是否升级到更高层级的索引,可以确保跳跃表的平衡性和性能。如果没有随机函数,所有节点都会被插入到最高层级的索引中,这将导致跳跃表的查询性能下降。

​ 通过随机函数的引入,跳跃表可以在插入新节点时动态地决定节点的层级分布,使得节点在不同层级上的分布更加均匀,提高了查询效率。同时,通过调整随机函数的概率阈值,还可以对跳跃表的结构进行灵活的控制,以适应不同数据集和查询模式的需求。

跳跃表和b+树对比

在一般情况下,B+树相对于跳跃表来说更加占用空间。

​ B+树是一种平衡树结构,每个节点包含多个键和对应的子节点,叶子节点形成有序链表。B+树的每个节点都需要存储键和子节点的信息,以及一些管理结构和指针。相对于链表结构的跳跃表,B+树在每个节点上存储的数据量更多,所以通常会占用更多的存储空间。

​ 跳跃表在每个节点中只需要存储值和指向下一级节点的指针,而B+树的节点需要存储键、值和子节点的指针。此外,B+树的节点结构相对复杂,可能包含额外的管理信息(如节点的层级、父节点的指针等),这也会占用一定的空间。

​ 虽然跳跃表需要额外的索引层来提供快速的查找,但是它相对于B+树来说在整体结构和节点的存储上更加简单,所以通常情况下跳跃表相对更加节省空间。

​ 需要根据具体的应用场景和需求选择适合的数据结构。如果空间占用是一个关键因素,而查询效率相对次要,可以考虑使用跳跃表。如果查询效率是首要考虑的因素,并且可以承担更高的空间占用,可以选择B+树。

2.字典

img

Redis 的字典是一种高效的键值对存储结构,用于实现 Redis 中的多个功能,提供快速的查找和插入操作,并支持动态扩容和冲突处理。

​ Redis的字典(Dictionary)是一种用于存储键值对的数据结构。它在 Redis 中被广泛应用,用于实现 Redis 的核心数据结构之一——哈希表。

​ 字典的作用是提供高效的键值对存储和查找。在 Redis 中,字典被用于实现键的存储和索引,它是实现 Redis 数据库中键值对存储和快速访问的重要组件。

字典的特点包括:

  1. 高效的查找和插入操作:字典使用哈希表作为底层实现,通过哈希算法将键映射到哈希表的索引位置,从而实现快速的查找和插入操作。平均情况下,字典的查找和插入操作的时间复杂度为 O(1)。
  2. 动态扩容:字典的大小是可以动态调整的,当字典的负载因子达到一定阈值时,会自动触发扩容操作,重新调整哈希表的大小,以保证字典的性能和空间效率。
  3. 冲突处理:由于哈希算法不可避免地会出现键的冲突(多个键映射到同一个哈希表索引位置),字典使用链地址法(拉链法)来解决冲突。具体来说,每个哈希表索引位置上维护一个链表,将映射到同一索引的键值对链接在一起。

在 Redis 中,字典被广泛应用于多个功能的实现,例如:

  • 实现 Redis 的键空间:Redis 数据库中的所有键以及与之对应的值都存储在字典中。
  • 哈希类型的底层实现:Redis 的哈希类型使用字典来存储键值对,实现了快速的字段查找和插入操作。
  • 命令的实现:Redis 的命令字典用于存储命令名称和对应的命令处理函数。

字典的实现

Redis的字典是通过哈希表实现的,哈希表使用数组存储键值对,通过哈希函数计算键的索引位置,使用线性探测法解决冲突,支持动态扩容。这种实现方式使得Redis的字典具有快速的查找和插入操作,并能够处理大量的键值对。

​ 哈希表是一种基于哈希函数的数据结构,它通过将键映射到哈希表的索引位置来实现快速的查找和插入操作。在Redis中,哈希表被用作字典的底层实现。

​ Redis的哈希表采用开放地址法(Open Addressing)来解决键的冲突。具体实现上,Redis使用的是线性探测法(Linear Probing),当发生冲突时,会按照一定的步长依次探测哈希表的下一个位置,直到找到一个空槽来存储键值对。

下面是Redis哈希表的主要组成部分:

  1. 哈希表数组:Redis的哈希表由一个数组构成,每个数组元素称为哈希表节点(Hash Table Node)。每个节点存储了一个键值对,包括键和值的指针。

  2. 哈希函数:Redis使用一种双重哈希函数(Double Hashing)来计算键的哈希值,并将哈希值映射到数组的索引位置。

  3. 冲突解决:当多个键映射到同一个索引位置时,发生了冲突。Redis使用线性探测法来解决冲突,即依次检查下一个位置,直到找到一个空槽。

    img

  4. 动态扩容:当哈希表的负载因子超过一定阈值时,Redis会触发扩容操作,重新分配更大的数组,并将现有的键值对重新插入到新的哈希表中。这样可以保持哈希表的性能和空间效率。

3.压缩列表

在这里插入图片描述

压缩列表通过紧凑的存储方式、分层结构和数据压缩技术实现了高效的存储和表示方式。它在 Redis 中被广泛应用于列表和有序集合的存储,以及相关操作的实现。压缩列表的设计使得 Redis 可以在较小的内存占用下存储大量的元素,提供了高效的数据结构支持。

压缩列表(Compressed List)是 Redis 中用于存储和表示列表和有序集合的一种数据结构。它采用紧凑的方式存储多个元素,通过连续的内存块来减少存储空间的占用。

压缩列表的实现方式相对简单,下面是它的主要特点和实现原理:

  1. 紧凑存储:压缩列表将多个元素紧凑地存储在一块连续的内存区域中,避免了元素之间的指针开销,从而减少了存储空间的占用。
  2. 有序性:压缩列表中的元素按照插入顺序排列,并且支持按照元素的位置索引进行快速访问。
  3. 灵活的数据类型支持:压缩列表可以用于存储列表(List)和有序集合(Sorted Set)两种数据类型。它可以存储不同类型的元素,例如整数、浮点数和字节数组等。
  4. 分层结构:压缩列表可以分为多个层级,每个层级包含一系列连续的节点。每个节点包含一个字节数组来存储元素数据,并带有一些控制信息,如元素长度和编码方式。
  5. 数据压缩:为了进一步减少存储空间的占用,压缩列表使用不同的编码方式来表示不同长度的元素。根据元素的长度,可以选择使用整型编码、字节数组编码或者整型浮点数编码。

压缩列表优缺点

压缩列表在存储空间效率和插入/删除操作的性能上具有优势。然而,在随机访问和遍历操作方面可能存在一些开销。因此,在选择数据结构时,需要根据具体的使用场景和需求来权衡压缩列表的优缺点。

优点:

  1. 紧凑的存储形式:压缩列表采用紧凑的存储方式,通过连续的内存块存储多个元素,避免了指针开销,减少了存储空间的占用。
  2. 快速的插入和删除操作:由于数据的紧凑存储形式,压缩列表在插入和删除操作上表现出色。它可以在常数时间内进行这些操作,而不会受到内存分配和指针调整的开销。
  3. 有序性和快速的索引访问:压缩列表中的元素按照插入顺序排列,并且支持按照位置索引进行快速访问。通过偏移量计算,可以在常数时间内访问特定位置的元素。
  4. 简单的实现和高效的内存管理:相对于其他数据结构,压缩列表的实现相对简单,减少了额外的数据结构开销。此外,它还能有效地利用内存,因为它不需要为每个元素分配独立的节点。

缺点:

  1. 随机访问开销:虽然压缩列表支持按照位置索引进行快速访问,但对于大型列表,随机访问的性能会受到限制。这是因为压缩列表不具备像数组那样的连续内存访问特性,而是通过偏移量进行跳跃式访问。
  2. 遍历开销:由于压缩列表是紧凑存储的,遍历整个列表的开销相对较高。如果需要频繁地进行遍历操作,可能会影响性能。
  3. 更新操作的复杂性:对于较大的压缩列表,插入和删除操作可能涉及到数据的移动和内存的重新分配,这会带来一定的复杂性和开销。

4.快速列表

img

快速列表(Quicklist)是 Redis 中用于存储和表示列表的一种数据结构。它是为了解决 Redis 列表在插入和删除操作上的性能问题而引入的一种优化数据结构。

快速列表的设计思想是将一个列表分割成多个小的压缩列表片段,每个片段称为一个节点(Node)。每个节点都是一个压缩列表,使用压缩列表的紧凑存储方式来存储多个元素。

快速列表的实现方式如下:

  1. 链表结构:快速列表是由多个节点(Node)组成的双向链表。每个节点表示一个压缩列表片段。
  2. 压缩列表片段:每个节点是一个压缩列表,它使用紧凑的方式存储多个元素。压缩列表片段的大小可以根据需要进行调整,以平衡内存占用和操作性能。
  3. 节点指针:每个节点都有一个前向指针和一个后向指针,用于将所有节点连接成一个双向链表。

快速列表在列表操作中的性能表现如下:

  • 在头部和尾部插入和删除操作上,快速列表可以在常数时间内完成,因为只需要操作链表的指针,无需移动其他元素。
  • 在中间位置的插入和删除操作上,快速列表的性能可能受到影响,因为需要找到插入或删除位置所在的节点,然后对节点中的压缩列表进行修改。

快速列表的优势在于它将大型列表分割成多个小的压缩列表片段,从而在插入和删除操作上提供了较好的性能。它可以同时兼顾内存占用和操作效率。通过链表结构,快速列表还支持在头部和尾部进行快速的插入和删除操作。

表的性能可能受到影响,因为需要找到插入或删除位置所在的节点,然后对节点中的压缩列表进行修改。

快速列表的优势在于它将大型列表分割成多个小的压缩列表片段,从而在插入和删除操作上提供了较好的性能。它可以同时兼顾内存占用和操作效率。通过链表结构,快速列表还支持在头部和尾部进行快速的插入和删除操作。

需要注意的是,快速列表主要针对 Redis 中的列表数据类型进行了优化,不适用于其他数据结构。它是 Redis 在列表操作上的一种优化策略,提供了更好的性能和内存管理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 FreeCAD 软件打开 stp、dwg、dxf 等模型文件并测量零件尺寸

1、下载安装 FreeCAD 软件 https://www.freecad.org/downloads.php 2、打开 stp 等模型文件,选择 framework 查看方式(只显示点、线) 3、切换到 Part 菜单栏 4、打开 Measure Linear 工具(测量线性距离) 5、选择两个…

初探KVM虚拟化技术:新手指南

首先了解一下虚拟化的概念 虚拟化是指对资源的逻辑抽象、隔离、再分配、管理的一个过程,通常对虚拟化的理解有广义狭义之分。广义包括平台虚拟化、应用程序虚拟化、存储虚拟化、网络虚拟化、设备虚拟化等等。狭义的虚拟化专门指计算机上模拟运行多个操作系统平台。…

安卓设备监听全部输入信号

前言: 最近团队收到一个产品需求,需要监听安卓设备上用户是否有输入行为,以免定制推荐的时候打搅到用户。这里指的是设备上所有应用的输入行为,而不是单指某一个应用。 这个需求还是蛮有挑战性的,需要涉及到很多FW层…

Java设计模式之模板模式

1. 模板模式介绍 1、模板模式即模板方法模式自定义了一个操作中的算法骨架,而将步骤延迟到子类中,使得子类可以不改变一个算法的结构,可以自定义该算法的某些特定步骤; 2、父类中提取了公共的部分代码,便于代码复用&am…

PyTorch深度学习实战(5)——计算机视觉基础

PyTorch深度学习实战(5)——计算机视觉基础 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示 3 利用神经网络进行图像分析的优势小结系列链接 0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析&#xff…

Scala(二)

第2章 变量和数据类型 2.1 注释 Scala注释使用和Java完全一样。 注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。 1)基本语法 (1)单行注释:// (2&#xff0…

高时空分辨率、高精度一体化预测技术的风、光、水自动化预测技术的应用

第一章 预测平台讲解及安装 一、高精度气象预测基础理论介绍 综合气象观测数值模拟模式; 全球预测模式、中尺度数值模式; 二、自动化预测平台介绍 Linux系统 Crontab定时任务执行机制 Bash脚本自动化编程 硬件需求简介 软件系统安装 …

独立站该怎么带来客户流量?来看看这五大方法吧!

建立独立站是为了让更多的人知道你的品牌和产品,从而吸引潜在客户并转化为销售机会。以下是一些可以帮助独立站带来客户流量的方法: 01.SEO(搜索引擎优化): 优化网站的SEO,使得搜索引擎能够更好地找到你的…

MyBatis之慎用association

这里先总结一下 association 存在的问题。 一、内嵌查询时存在报错Id找不到及内存溢出隐患 二、一对多关系数据重复问题 三、多层嵌套内层 association 查询结果为null 或 非预期的值 一、内嵌查询时存在报错Id找不到及内存溢出隐患 参考: https://www.lmlphp.co…

DP358/321/323/324运算放大器芯片

DP358、DP321、DP323、DP324是一款低噪声、低压、低 功耗轨到轨输出运放大器,该系列放大器的增益带宽为 11MHz,压摆率为 8.5V/uS,其中DP323 在掉电工作模式下待机电流小于1uA。该系列放大器可以广泛应用于各种电子产品领域。 主要特性: 轨到轨最大输入…

电脑提示msvcr110.dll丢失怎样修复呢?推荐三个修复方法

Windows系统总是不可避免会出现系统报错,提示msvcr110.dll丢失,无法运行启动软件程序,主要就是由于系统的msvcr110.dll丢失或者损坏。msvcr110.dll是Microsoft Visual C Redistributable软件包中的一个文件,它是由Microsoft Visua…

【文生图系列】Stable Diffusion Webui安装部署过程中bug汇总(Linux系统)

文章目录 bugs虚拟环境pythongfpgan和cython bugs 看网上部署stable diffusion webui的教程,很简单。而且我也有部署stable diffusion v1/v2的经验,想着应该会很快部署完stable diffusion webui,但是没想到在部署过程中,遇到各种…

【数据分析 - 基础入门之pandas篇③】- pandas数据结构——DataFrame

文章目录 前言一、DataFrame创建1.1 字典创建1.2 NumPy二维数组创建 二、DataFrame切片2.1 行切片2.2 列切片2.3 行列切片 三、DataFrame运算3.1 DataFrame和标量的运算3.2 DataFrame之间的运算3.3 Series和DataFrame之间的运算 四、DataFrame多层次索引4.1 多层次索引构造1.隐…

AJAX异步请求JSON数据格式

目录 前言 1.AJAX的实现方式 1.1原生的js实现方式 1.2JQuery实现方式 2.1语法 3.JSON数据和Java对象的相互转换 3.1将JSON转换为Java对象 3.2将Java对象转换为JSON 前言 AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和 XML。 Ajax 是一种在…

在安卓里用c++显示骨骼动画

1. 程序模块图 2. 编译第三方库Assimp 2.1 下载 官网下载5.0.0版本,https://codeload.github.com/assimp/assimp/zip/refs/tags/v5.0.0 2.2 生成安卓编译链 解压后在assimp-5.0.0下建文件夹BuildAssimp 放两个脚本make_standalone_toolchain.bat python D:/Android/Sdk/nd…

安达发|各部门实施APS系统前后有哪些变化?

众所周知,生产计划部门是制造企业的重要部门,承担销售、采购、仓储、质量检验和生产的各个部门的协调工作。APS 先进计划排程系统系统通过人工智能算法跟踪所有资源,包括材料、设备、人员、客户需求、订单变更等,自动快速计算出“…

odoo-031 odoo13和odoo16的网站上添加显示变体描述 Website Add Variant Description

文章目录 测试环境需求描述实现步骤实际效果思路说明 测试环境 Odoo 版本: odoo13 和 odoo16 Python 版本:3.6.9 操作系统:Ubuntu 18.04 需求描述 添加变体描述,显示在 form 视图;在网站上动态显示产品变体描述。 …

QT之智能指针

如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码以释放资源,而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

在 3ds Max 中创建逼真的玻璃材质

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 尽管本教程基于 3ds Max,但相同的设置适用于许多其他 3D 产品。 注意:单击每个步骤中的缩略图可查看更大的屏幕截图,其中包括视口和用户界面的相关部分。 步骤 1由于本教…

Linux的权限管理精细总结

(该图由AI绘制 关注我 学习AI画图) 目录 一、权限概述 1、权限的基本概念 2、为什么要设置权限 3、Linux用户身份类别 4、user文件拥有者 5、group文件所属组内用户 6、other其他用户 7、特殊用户root 二、普通权限管理 1、ls -l命令查看文件…