有序集合ZSET【Redis对象篇】
🏆 作者简介:席万里
⚡ 个人网站:https://dahua.bloggo.chat/
✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。
🍻 对计算机充满兴趣,愿意并且希望学习更多的技术,接触更多的大神,提高自己的编程思维和解决问题的能力。
Sorted SET
文章目录
- 跳表
- 1.跳表是什么?
- 2.Redis的跳表实现
- 总结(重要)
- ZSET
- 1.ZSET是什么?
- 2.适用场景
- 3.常用操作
- 4.底层实现
- 5.总结(重要)
跳表
1.跳表是什么?
跳表是Redis有序集合ZSet底层的数据结构,跳表在ZSET中尤其重要。
跳表的本质还是链表,只是在普通链表的基础上,增加了多级的索引,通过索引可以一次实现多个节点的跳跃,提高性能。
跳表的结构
![[图片]](https://i-blog.csdnimg.cn/direct/1791ce98e23841af9ffdb23b43bda1de.png)
标准的跳表(Redis不是使用标准的跳表)有以下限制:
- score值不能重复;
- 只有向前指针,没有回退指针。
2.Redis的跳表实现
![[图片]](https://i-blog.csdnimg.cn/direct/bf0b7016038d48d380837a093a3f9a1c.png)
![[图片]](https://i-blog.csdnimg.cn/direct/827dd1e26f9b4d4da7b24eddd27c302c.png)
Redis跳表单个节点有几层?
层次的决定,需要比较随机,Redis是使用概率均衡的思路来确定新插入节点的层数。
Redis跳表决定每一个节点,是否能增加一层的概率为25%,而最大层数限制在Redis5.0是64层,Redis7.0是32层。
Redis跳表优化了多少?
O(N)降低到log(N)。
总结(重要)
1、跳表是什么?和普通链表的区别?
跳表也算链表,不过相对普通链表,增加了多级索引,通过索引可以实现O(logN)的元素查找效率。
2、聊聊跳表的查找过程?
从高级索引往后找,如果下个节点比当前大,就降级继续找。
3、跳表查询节点总数的平均时间复杂度?
跳变编码模式下,查询节点总数的平均时间复杂度是O(1),因为跳表头结构中定义了一个保存节点数量的字段Length,源码中调用查询节点总数的api时会直接返回这个字段。
4、跳表中一个节点的层高是怎么决定的?
跳表插入新节点会计算一个随机的层高,跳表的每一个节点一开始默认都是1层,然后每增加一层的概率都是25%,在5.0版本最高为64层。
5、跳表插入一条数据的平均时间复杂度?
跳表是一种支持多级索引的结构,查询效率媲美二分查找,插入一条数据的时间复杂度为OlogN。
6、跳表插入数据会影响其他节点吗?
不会。节点层高在创建时就确认了,不会被新插入节点影响。新插入节点只会影响每一层前一跳、后一跳的关联指针。
ZSET
1.ZSET是什么?
ZSET就是有序集合,也叫SORTED SET,是一组按关联积分有序的字符串集合,这里的分数是个抽象概念,任何指标都可以抽象为分数,以满足不同场景。积分相同的情况下,按字典序排序。
2.适用场景
用于需要排序集合的场景,最为典型的就是游戏排行榜。
3.常用操作
- 创建:ZADD
- 查询:ZRANGE、ZCOUNT、ZRANK、ZCARD、ZSCORE
- 更新:ZADD、ZREN
- 删除:DEL、UNLINK
1.写操作
1、ZADD key scoremember [score member …]
向ZSET增加数据,如果key已经存在,则更新对应数据。
扩展参数: - XX:仅更新存在的成员,不添加新成员。
- NX:不更新存在的成员,只添加新成员。
- LT:更新新的分值比当前分值小的成员,不存在则新增。
- GT:更新新的分值比当前分值大的成员,不存在则新增。
![[图片]](https://i-blog.csdnimg.cn/direct/b0703c3edd754243bf48a2008244d6df.png)
![[图片]](https://i-blog.csdnimg.cn/direct/a2185cf19ca94720b2c3b5e7086e5ec8.png)
2、ZREM key member[member …] ,删除ZSET中的元素。
2.读操作
1、ZCARD key,查看成员总数。
2、ZRANGE key start stop,查看从start到stop范围的ZSET数据。
3、ZREVRANGE key start stop,从大到小遍历。
4、ZCOUNT key min max,计算min-max积分范围的成员个数。
5、ZRANK key member,查看ZSET中的member的排名索引。
6、ZSCORE key member,查询ZSET中成员的分数。
![[图片]](https://i-blog.csdnimg.cn/direct/3be6d9919acd4cb7a64948f1bef4b62e.png)
![[图片]](https://i-blog.csdnimg.cn/direct/d64b98d6333a4c858527e8eab23e868b.png)
4.底层实现
ZSET编码有两种方式,一种是ZIPLIST,另一种是SKIPLIST+HASHTABLE。
ZIPLIST编码的使用条件:
- 列表对象保存的所有字符串对象长度都小于64字节。
- 列表对象元素个数少于128个。
若有一条不满足,编码就使用SKIPLIST+HASHTABLE。
SKIPLIST是一种可以快速查找的多级链表结构。并且还使用HASHTABLE来配合查询O(1)。
![[图片]](https://i-blog.csdnimg.cn/direct/42b661531aed4e8dbe401e88ffe188ea.png)
5.总结(重要)
1、ZSET底层有哪些编码方式?
ZSET底层有两种编码方式,当ZSET元素大小小于64字节,数量小于128时,编码为ZIPLIST,否则就为HASHTABL+SKIPLIST。
2、跳表模式下,查询节点总数的时间复杂度?
通过字段获得,O(1)。
3、跳表中一个节点的层高是怎么决定的?
跳表的每一个节点每增加一层的概率都是25%,最高为32层。
4、跳表插入一条数据的平均时间是多少?
跳表通过创建多级索引的方式,可以对比二分查找,理论上,插入一条数据的时间复杂度为Ologn。
5、为什么跳表和HASHTABLE配合使用呢?
跳表适合范围查询,HT适合单点查询,执行ZSCORE的时候用HT,执行ZRANK的时候用跳表。
6、为什么不用B+树?
B+树的数据都存放在叶子节点,使得查找时可能会占用更大的内存,而且B+树插入数据需要维护树的平衡,开销比跳表更大。
相关文章:
有序集合ZSET【Redis对象篇】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...
力扣-图论-9【算法学习day.59】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
如何选择安全、可验证的技术?
澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件,题为《选择安全和可验证的技术》,旨在帮助组织在采购软件(专有或开源)、硬件(例如物联网设备)和云服务(SaaS、MSP 服务…...
Allure在自动化测试中的应用
01 Allure的简介及使用 1、应用场景 自动化的结果一定是通过一个报告来进行体现 Allure 是一个独立的报告插件,生成美观易读的报告,目前支持Python、Java、PHP、C#等语言 为dev/QA 提供详尽的测试报告、测试步骤、日志,也可以为管理层提供统…...
C# 探险之旅:第十一节 - 循环(foreach):一场“遍历”奇幻岛的大冒险!
嘿,勇敢的探险家们!欢迎来到C#奇幻岛的第十一站——“遍历”奇幻岛!今天,我们要乘坐一艘叫做foreach的魔法船,去遍历(也就是一个一个看过来)岛上那些神秘的宝藏箱!准备好了吗&#x…...
Ubuntu24.04配置STMTrack
项目地址:https://github.com/fzh0917/STMTrack 一、安装 CUDA 参考链接: Ubuntu24.04配置DINO-Tracker Ubuntu多CUDA版本安装及切换 由于之前在其他项目中已经安装了 CUDA12.1,这次需要安装另一个版本。 1. 查看安装版本 按照 requireme…...
【Java学习笔记】Map接口和常用方法
一、 Map接口实现类的 特点[很实用] key是自己存的java对象 value是一个固定的 //当有相同的 k ,就等价于替换. 二、 Map常用方法 (根据键–>k) 三、Map接口遍历方法 package com.hspedu.map_; import java.util.*; /** * author 韩顺平 * ver…...
uniapp支持App横竖屏开发总结
一、需求: app要支持重力感应自动切换横竖屏,并切换后样式不能错乱 二、实现 官方文档 官方Git manifest.json文件中 "app-plus" : {"screenOrientation" : ["portrait-primary","portrait-secondary","…...
【工作笔记】Lombok版本变化导致的反序列化异常
Lombok版本变化导致的反序列化异常 背景 因为安全性的考虑,最近在梳理旧系统的系统依赖。改动依赖时候还好,毕竟只是换掉不再合作公司的旧依赖,没敢动别的太多东西。不过没多久,测试团队就找来了… 排查问题之第一次跑偏 旧系…...
多模态大语言模型 MLLM 部署微调实践
1 MLLM 1.1 什么是 MLLM 多模态大语言模型(MultimodalLargeLanguageModel)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模…...
LNMP和Discuz论坛
文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…...
Cadence学习笔记 2 PCB封装绘制
基于Cadence 17.4,四层板4路HDMI电路 更多Cadence学习笔记:Cadence学习笔记 1 原理图库绘制 目录 2、PCB封装绘制 2、PCB封装绘制 封装尺寸如下。 用Allegro做PCB封装前,要先做焊盘(Allegro 比AD、PADS多一个步骤:绘制…...
网络安全——防火墙
基本概念 防火墙是一个系统,通过过滤传输数据达到防止未经授权的网络传输侵入私有网络,阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障,因为网上总有黑客和恶意攻击入侵私有网络来破坏,防火…...
【CSS in Depth 2 精译_074】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(下):行内元素的间距设置
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 ✔️ 12.2 Web 字体12.3 谷歌字体 文章目…...
短视频矩阵抖音SEO源码OEM独立部署
短视频优化矩阵源码涉及对抖音平台上的视频内容进行筛选与排序,目的是增强其在搜索引擎中的可见度,以便更多用户能够浏览到这些视频。而抖音SEO优化系统则是通过构建一个分析框架,来解析抖音上的用户数据、视频信息及标签等元素,并…...
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…...
在ensp中ACL路由控制实验
一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…...
μC/OS-Ⅱ源码学习(3)---事件模型
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) 本文开始,进入事件源码的学习。 事件模型 在一个多任务系统里,各个任务在系统的统筹下相继执行,由于执行速度极快&a…...
Jmeter进阶篇(30)深入探索 JMeter 监听器
前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…...
虚幻引擎的工程目录结构
虚幻引擎的工程目录结构如下: .idea/.vs:用于IDE(如IntelliJ IDEA或Visual Studio)的项目配置文件,包含工程设置和解决方案文件。 Binaries:存放编译后的可执行文件和相关的动态链接库(DLL&…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
