当前位置: 首页 > news >正文

有序集合ZSET【Redis对象篇】

🏆 作者简介:席万里
⚡ 个人网站:https://dahua.bloggo.chat/
✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。
🍻 对计算机充满兴趣,愿意并且希望学习更多的技术,接触更多的大神,提高自己的编程思维和解决问题的能力。

Sorted SET

文章目录

  • 跳表
    • 1.跳表是什么?
    • 2.Redis的跳表实现
    • 总结(重要)
  • ZSET
    • 1.ZSET是什么?
    • 2.适用场景
    • 3.常用操作
    • 4.底层实现
    • 5.总结(重要)

跳表

1.跳表是什么?

跳表是Redis有序集合ZSet底层的数据结构,跳表在ZSET中尤其重要。
跳表的本质还是链表,只是在普通链表的基础上,增加了多级的索引,通过索引可以一次实现多个节点的跳跃,提高性能。
跳表的结构
[图片]

标准的跳表(Redis不是使用标准的跳表)有以下限制:

  1. score值不能重复;
  2. 只有向前指针,没有回退指针。

2.Redis的跳表实现

[图片]

[图片]

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:更新新的分值比当前分值大的成员,不存在则新增。
    [图片]

[图片]

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中成员的分数。
[图片]

[图片]

4.底层实现

ZSET编码有两种方式,一种是ZIPLIST,另一种是SKIPLIST+HASHTABLE。
ZIPLIST编码的使用条件:

  1. 列表对象保存的所有字符串对象长度都小于64字节。
  2. 列表对象元素个数少于128个。
    若有一条不满足,编码就使用SKIPLIST+HASHTABLE。
    SKIPLIST是一种可以快速查找的多级链表结构。并且还使用HASHTABLE来配合查询O(1)。
    [图片]

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&…...

CodeT5安全使用指南:如何避免代码生成中的潜在风险

CodeT5安全使用指南:如何避免代码生成中的潜在风险 【免费下载链接】CodeT5 Home of CodeT5: Open Code LLMs for Code Understanding and Generation 项目地址: https://gitcode.com/gh_mirrors/co/CodeT5 CodeT5作为一款强大的代码理解与生成AI模型&#x…...

Qwen3-14B企业知识图谱构建:从私有文档抽取实体关系实践

Qwen3-14B企业知识图谱构建:从私有文档抽取实体关系实践 1. 企业知识图谱构建概述 在当今企业数字化转型浪潮中,知识图谱作为结构化知识表示的重要方式,正成为企业知识管理的核心基础设施。传统知识图谱构建需要大量人工标注和规则设计&…...

如何让Windows 11告别臃肿?Win11Debloat完整指南帮你一键优化系统

如何让Windows 11告别臃肿?Win11Debloat完整指南帮你一键优化系统 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declu…...

如何用开源工具实现3D打印钥匙自由?从参数测量到模型生成的实践路径

如何用开源工具实现3D打印钥匙自由?从参数测量到模型生成的实践路径 【免费下载链接】keygen OpenSCAD tools for generating physical keys 项目地址: https://gitcode.com/gh_mirrors/ke/keygen 在数字化制造蓬勃发展的今天,3D打印技术正逐步走…...

Natapp内网穿透避坑指南:Windows系统常见报错解决方案(2024最新版)

Natapp内网穿透避坑指南:Windows系统常见报错解决方案(2024最新版) 在开发过程中,内网穿透工具如Natapp已成为连接本地开发环境与外部网络的必备利器。然而,对于初次接触Natapp的Windows用户来说,从安装配…...

告别格式枷锁:ncmdumpGUI让音乐自由播放变得触手可及

告别格式枷锁:ncmdumpGUI让音乐自由播放变得触手可及 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 开篇痛点直击:那些被NCM格式困住的…...

Magma智能剪辑系统:视频自动生成实战

Magma智能剪辑系统:视频自动生成实战 1. 引言 想象一下这样的场景:你有一个精彩的视频创意,写好了详细的脚本,但面对一堆零散的素材片段却无从下手。传统的视频剪辑需要逐帧挑选、拼接、添加转场,一个几分钟的视频可…...

3个突破限制步骤:res-downloader让网络资源获取变得无拘无束

3个突破限制步骤:res-downloader让网络资源获取变得无拘无束 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...

工程仿真平台OpenRocket:从物理试验到数字孪生的技术跃迁

工程仿真平台OpenRocket:从物理试验到数字孪生的技术跃迁 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 在现代工程设计领域,物理…...

OpenClaw开源项目深度体验:对比其与星图GPU平台Qwen3-14B-Int4-AWQ部署差异

OpenClaw开源项目深度体验:对比其与星图GPU平台Qwen3-14B-Int4-AWQ部署差异 1. 项目概览与核心功能 OpenClaw是近期备受关注的开源大模型项目,主打轻量化和易部署特性。它采用混合专家架构(MoE),在保持模型性能的同时显著降低了计算资源需求…...