Redis数据结构之Zset

article/2025/9/13 22:56:11

文章目录

  • 一、zset数据结构
  • 二、跳表skipList
    • 什么是跳表?
      • 1.跳表的查找
      • 2.跳表的插入
      • 3.跳表的删除
      • 4.跳表的更新

一、zset数据结构

相比于set,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。

zset有两种不同的实现,分别是zipListskipList

zipList:
满足以下两个条件:

  • [score,value]键值对数量少于128个;
  • 每个元素的长度小于64字节;

skipList:
不满足以上两个条件时使用跳表(组合了hashskipList

  • hash用来存储value到score的映射,这样就可以在O(1)时间内找到value对应的分数;
  • skipList按照从小到大的顺序存储分数;
  • skipList每个元素的值都是[score,value]对

Redis 中 zset 不是单一结构完成,是跳表和哈希表共同完成。
实现方式:Redis sorted set的内部使用HashMap和跳跃表(skipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

使用zipList的示意图如下所示:
img

使用跳表时的示意图:
img
在这里插入图片描述
zset 结构中,既支持按单个元素查询,又支持范围查询。

二、跳表skipList

什么是跳表?

对链表进行改造,在链表上建索引,即每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引。这种链表加多级索引的结构,就是跳表。
在这里插入图片描述
跳表的特点:

  • 由许多层结构组成。
  • 每一层都是一个有序的链表。
  • 最底层 (Level 1) 的链表包含所有元素。
  • 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
  • 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

跳表的优点:
跳表可以保证增、删、查等操作时的时间复杂度为O(logN),且维持结构平衡的成本比较低,完全依靠随机。而二叉查找树在多次插入删除后,需要Rebalance来重新调整结构平衡。

跳表的缺点:
跳表占用的空间比较大(多级索引),其实就是一种空间换时间的思想。

跳表的特点:

  • 由许多层结构组成。
  • 每一层都是一个有序的链表。
  • 最底层 (Level 1) 的链表包含所有元素。
  • 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
  • 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

1.跳表的查找

跳表的查找会从顶层链表的头部元素开始,然后遍历该链表,直到找到元素大于或等于目标元素的节点,如果当前元素正好等于目标,那么就直接返回它。如果当前元素小于目标元素,那么就垂直下降到下一层继续搜索,如果当前元素大于目标或到达链表尾部,则移动到前一个节点的位置,然后垂直下降到下一层。

2.跳表的插入

为跳表插入数据,首先需要找到插入的位置,然后执行插入操作。
可以通过图看一下插入的过程:
img

如果我们不停的向跳表中插入元素,就可能会造成两个索引点之间的结点过多的情况。结点过多的话,我们建立索引的优势也就没有了。所以我们需要维护索引与原始链表的大小平衡,也就是结点增多了,索引也相应增加,避免出现两个索引之间结点过多的情况,查找效率降低。

跳表是通过一个随机函数来维护这个平衡的,当我们向跳表中插入数据的的时候,我们可以选择同时把这个数据插入到索引里,那我们插入到哪一级的索引呢,这就需要随机函数,来决定我们插入到哪一级的索引中。

这样可以很有效的防止跳表退化,而造成效率变低。

3.跳表的删除

  1. 自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点。O(logN)
  2. 删除每一层查找到的节点,如果该层只剩下1个节点,删除整个一层(原链表除外)。O(logN)

总体上,跳跃表删除操作的时间复杂度是O(logN)。
整个删除过程,可以简化理解为:先找到,断关联,删内存

4.跳表的更新

当我们调用zadd方法时,如果对应的value不存在,那就是插入过程。如果这个value 已经存在了,只是调整一下 score 的值,那就需要走一个更新的流程。假设这个新的score 值不会带来排序位置上的改变,那么就不需要调整位置,直接修改元素的 score 值就可以了。但是如果排序位置改变了,那就要调整位置。


http://chatgpt.dhexx.cn/article/poy590uY.shtml

相关文章

Redis数据结构有哪些

Redis数据结构有哪些 一、Redis数据结构 一、Redis数据结构 Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为 索引找到当前缓存的数据,并且返回给程序…

「Redis数据结构」压缩列表(ZipList)

「Redis数据结构」压缩列表(ZipList) 文章目录 「Redis数据结构」压缩列表(ZipList)一、概述二、结构三、连锁更新问题四、压缩列表的缺陷五、小结参考 ZipList 是一种特殊的“双端链表” ,由一系列特殊编码的连续内存…

redis数据结构hash

Redis数据结构之hash Hash存储结构 Hash是一个string 类型的field和value的映射表。Hash特别适合存储对象,相对于将对象的每个字段存成单个string 类型。一个对象存储在Hash类型中会占用更少的内存,并且可以更方便的存取整个对象。 我们简单举个实例来…

简述redis数据结构

String:字符串 List:列表 Hash:哈希表 Set:无序集合 Sorted Set:有序集合 bitmap:布隆过滤器 GeoHash:坐标,借助Sorted Set实现,通过zset的score进行排序就可以得到坐标附…

Redis数据结构之——hash

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、Redis 数据结构hash的编码格式 Redis中hash数据类型使用了两种编码格式:ziplist(压缩列表)、hashtable(哈希表) 在redis.conf配置文件中,有以下两个参数,意思为:当节点数量小于512并…

Redis底层数据结构详解

Redis底层数据结构详解 我们知道Redis常用的数据结构有五种,String、List、Hash、Set、ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数据结构,这五种数据结构式怎么实现的&#xf…

Redis的五种基础数据结构

Redis的五种基础数据结构 Redis有5种基础数据结构,分别为:String(字符串),list(列表),hash(字典),set(集合)和zset(有序集合)。 1.String(字符串) 字符串的结构 字符串String是Redis最简单的数据结构,它的内部表示…

Redis的数据结构

一、redis的数据结构 1、String字符串类型 Redis的String能够表示字符串、整数、浮点数三种值的类型 应用场景: 普通的赋值使用incr、decr命令进行递增和递减统计数据。用于实现乐观锁watch(事物)setNx实现分布式锁 底层数据类型: // 数据结构 stru…

为了拿捏 Redis 数据结构,我画了 40 张图(完整版)

大家好,我是小林。 Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。…

IDEA 配置Services面板

IDEA中的services窗口是一个管理所有服务的地方,特别是在使用spring cloud项目开发中,对多个微服务的管理非常实用。 配置方式一: 在IDEA中可通过配置将services窗口面板显示出来。 配置方式二: 找到项目.idea目录下worksp…

如何在IDEA配置Tomcat

1、点击RUN下拉的Edit Configurations 2、点击左上角号,下拉找到Tomcat Server,选择Local 3、 配置Tmcat信息 4、点击Deployment,选择右边的号,选择Artifict 5、Application context这里只写个“/”就可以了 6、点击Apply,然后返回…

idea配置代理服务器

1、查看代理服务器ip和端口 使用http代理 2、idea中配置代理服务器 选择File --> Settings --> 搜索HTTP Proxy --> 选择Manual proxy configuration --> 选择HTTP输入ip和端口 --> 点击Apply 3、配置jvm启动参数 -Djava.net.useSystemProxiestrue 完成!

IDEA配置安卓环境

IDEA是JetBrains公司推出的Java集成开发环境 ,这学期又开了安卓课,少不了安卓环境,不过android stdio是完全支持安卓的,不适合开发java项目,作为小白,我觉得IDEA一个软件就够了,当然&#xff0c…

idea配置maven仓库

1、去达内开发文档服务器下载对应插件 达内开发文档服务器 找到配置文件下载 ,下载阿里云Maven创库配置 以上下载压缩包先不动 2、创建maven项目 打开idea file-----new project 点击左侧选择maven然后next 3、然后查看对应的maven路径 点击file---setting 每个…

IDEA配置本地Maven

IDEA配置Maven: 参考视频教程:https://www.bilibili.com/video/BV1Qf4y1T7Hx?p45 总体流程预览: 创建一个空的项目IDEA配置Maven环境Maven 坐标详解IDEA创建Maven项目IDEA导入Maven项目maven Helper插件依赖管理 1.创建一个空的项目 File—>New—>Project—>Empt…

idea配置tomcat

1.添加tomcat。 2.点击Edit Configurations后打开如下界面。| 3.点击加号 4.在这里配置tomcat信息, 5.填写好基本tomcat信息后,点击ok。我们就配置好了Tomcat,此时我们会看到。项目中显示了我们刚才配置的的Tomcat。 但是直接运行的话…

idea配置docker

IDEA作为开发电脑,要远程连接到另一台Linux电脑上部署的Docker服务,我们登陆到机器上,进行docker远程访问配置: IDEAdocker实践 - 邹姣姣 - 博客园 idea里 选择Plugins,插件 已经安装了docker插件 连接远程Docker服…

idea配置maven

idea配置maven 下载配置maven(如果有请跳过)打开idea开始配置maven附录: 下载配置maven(如果有请跳过) 首先你先得安装配置你本机maven的环境,官方下载maven,附带下载maven: 下载maven链接 我选择的时3.6.3-bin.zip&#xff0c…

Idea配置Tomcat服务器

一、新建项目 首先新建一个Java项目 此时只是新建了一个Java项目,还不能用于写JavaWeb程序,所以接下来需要添加Web框架,并 配置Tomact服务器 右键点击项目Demo1,选择【添加框架支持】,然后再左侧中选择【Web应用程序…

idea配置ant版本_idea配置ant项目

之前一直用的maven管理,所以编译 打包都交给了maven,但是最近接触了新的项目,不是用maven管理的,是ant去【管理】的(这么说不严谨),在用idea去本地启动tomcat的时候周折了一番,特记录。 1、找build.xml 里面…