zset.

zset  有序集合

zset 保留了 set 不能有重复元素的特点

zset 中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,使得 zset 内部的元素是可以维护有序性的。但是这个有序不是用下标作为排序依据的,而是根据分数(score)

数据结构是否允许重复元素是否有序有序依据
list索引下标
set
zset分数

常见命令

zadd

添加 \ 更新指定的元素以及关联的分数到 zset 中(分数符合 double 类型,+inf -inf 合法)

zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]

返回本次添加成功的元素个数  O(log(N))

XX  仅用于更新已经存在的元素,不会添加新的元素

NX  仅用于添加新的元素,不会更新已经存在的元素

LT  新的分数小于原分数就更新,反之不更新

GT  新的分数大于原分数就更新,反之不更新

CH  zadd 默认返回本次添加的元素个数,指定选项后,将包含本次更新的元素个数

INCR  类似 zincrby,将元素的分数加上指定的分数。只能指定一个元素和分数

分数相同时,按照元素自身的字典序排列

分数不同时,按照分数排列

zset  内部是按照升序排列

zrange

返回指定区间内的元素,按照分数升序

zrange key start stop [withscores]

返回区间内的元素列表  O(log(N) + M)  N 集合中元素的个数    M  start 到 stop 的元素个数

加上 withscores 将分数也一起返回

redis 内部存储数据时,是按照二进制的方式来存储的

redis 服务器不负责“字符编码”,把二进制转换成汉字,需要客户端支持    --raw

zcard

获取一个 zset 的基数(cardinality),即 zset 中的元素个数

zcard key

返回 zset 中的元素个数  O(1)

zcount

返回分数在 [min, max] 的元素个数(min max 默认包含,可通过 ( 排除)

zcount key min max

返回满足条件的元素列表个数  O(log(N))

zset 内部会记录每个元素当前的“排行” \ “次序”(下标)

查询到元素,就直接知道了元素所在的“次序”,直接把 min 和 max 对应的元素的次序减法

min 和 max 可以写成浮点数的形式(分数本身就是浮点数)

inf 无穷大                     -inf  无穷小

zrevrange

返回指定区间里的元素,按照分数降序排列

zrevrange key start stop [withscores]

返回区间内的元素个数  O(log(N) + M)

zrangebyscore

返回分数在 [min, max] 的元素

zrangebyscore key min max [withscores]

返回区间内的元素列表  O(log(N) + M)

zpopmax zpopmin

删除并返回分数最高的 count 个元素

zpopmax key [count ...]

zpopmin key [count ...]

返回 分数 和 元素列表  O(log(N) * count)

虽然 Redis 的有序集合记录了开头的元素,但是删除的时候使用的使用的是通用的删除函数,导致出现了重新查找的过程   O(1)  ——>  O(log(N))

如果存在多个元素,分数相同,同为最大值,zpopmax 删除时只删除其中一个元素

按照元素的字典序进行排列

bzpopmax bzpopmin

阻塞版本的 zpopmax  zpopmin

bzpopmax key [key ...] timeout

bzpopmin key [key ...] timeout

返回元素列表  O(log(N))

timeout  超时时间,支持小写形式

zrank  zrevrank

返回指定元素的排名(下标从 0 开始)

zrank key member  升序

zrevrank key member  降序

返回排名  O(log(N))

zcount  在计算时,先根据分数找到元素,再根据元素获取排名,把排名一减,得到元素个数

rev >= reverse

zscore

返回指定元素的分数

zscore key member

返回分数  O(1)

zrem

删除指定的元素

zrem key member [member ...]

返回本次删除的元素个数  O(log(N) * count)

zremrangebyrank

按照排序,删除指定范围内的元素(左闭右闭)升序

zremrangebyrank key start stop

返回本次删除的元素个数  O(log(N) + M)

zremrangebyscore

按照分数,删除指定范围内的元素(左闭右闭)升序

zremrangebyscore key min max       (  排除边界值

返回本次删除的元素个数  O(log(N) + M)

zincrby

为指定的元素的关联分数添加指定的分数值

zincrby key increment member

返回增加后的元素的分数  O(log(N))

zinter zinterstore

求出给定有序集合中元素的交集,并保存进目标集合中

合并过程中以元素为单位,元素对应的分数按照不同的聚合方式和权重得到新的分数

zinter numkeys key [key ...] [weights weight [weight ...]] [aggreg <sum | min | max >]

zinterstore destination numkeys key [key ...] [weights weight [weight ...]]

[aggreg <sum | min | max >]

返回目标集合的元素列表

返回目标集合中的元素个数  O(N*K) + O(M*log(M))

N  最小集合的元素个数     K  集合的个数      M  目标集合的元素个数

zunion  zunionstore

求出给定有序集合中元素的并集,并保存进目标集合中

zuoion numkeys key [key ...] [weights weight [weight ...]] [aggreg <sum | min | max >]

zunionstore destination numkeys key [key ...] [weights weight [weight ...]]

[aggreg <sum | min | max >]

O(N) + O(log(M) * M)

N  集合的个数     M  目标集合的元素个数

内部编码

1)ziplist(压缩列表)元素个数较少或者元素的体积较小

2)skiplist(跳表)

跳表是一个“复杂链表”,查询元素 O(N),相比于树状结构,更适合按照范围获取元素 (B+树)

应用场景

排行榜系统

例如网站上的热搜信息,榜单的维度是多方面的,“分数”是实时变化的

只要把相关信息和对应的分数放到 zset 中就会自动排序

随时可以按照下表进行查询,随着分数变化,使用 zincrby 也更方便,还可以自动排序

对于不同维度,可以将不同维度的数值都放到一个有序集合中,通过 zinterstore 或者 zunionstore 把上述集合按照权重进行集合间运算,得到结果集合

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

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

相关文章

Spring 数据库编程

Spring JDBC 传统的JDBC在操作数据库时&#xff0c;需要先打开数据库连接&#xff0c;执行SQL语句&#xff0c;然后封装结果&#xff0c;最后关闭数据库连接等资源。频繁的数据库操作会产生大量的重复代码&#xff0c;造成代码冗余&#xff0c;Spring的JDBC模块负责数据库资源…

492Q 型气缸盖双端面铣削组合铣床总体设计

一、引言 492Q 型气缸盖是发动机的重要组成部分&#xff0c;其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床&#xff0c;能够提高加工效率和质量&#xff0c;满足发动机生产的需求。 二、总体设计要求 加工精度&…

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…

第三阶段面试题

Nginx nginx常用模块以及其功能 proxy模块&#xff0c;进行代理功能 ssl模块&#xff0c;进行HTTPS协议的使用 gzip模块&#xff0c;进行传输数据的压缩 upstream模块&#xff0c;进行反向代理时使用 static模块&#xff0c;静态资源进行访问的模块 cache模块&#xff0…

鸿蒙NEXT开发键盘工具类(ArkTs)

export declare type KeyboardCallBack (show: boolean, height: number) > void; import { AppUtil } from ./AppUtil; import { LogUtil } from ./LogUtil; import { ArrayUtil } from ./ArrayUtil;/*** 键盘工具类* author 鸿蒙布道师* since 2025/04/18*/ export class…

基于 LabVIEW 的电液伺服阀测试台开发

开发了一种基于 LabVIEW 图形编程语言的自动测试系统&#xff0c;能够完成电液伺服阀的空载流量特性、压力增益特性、内泄漏特性等静态特性的自动测试。针对测试过程中干扰信号频段与正常信号频段接近&#xff0c;普通数字滤波器滤波效果不佳的问题&#xff0c;采用迭代滤波分解…

【uniapp】vue2 使用 Vuex 状态管理

创建store文件夹&#xff1a;store/index.js // index.js import Vue from vue import Vuex from vuex import address from ./modules/address.jsVue.use(Vuex)const store new Vuex.Store({modules: {address} })export default store 创建modules文件夹&#xff1a;modul…

c# 简单实现将Message的内容保存到txt中,超过100个则清理旧文件

using System; using System.IO; using System.Threading;public static class LogManager {private static readonly object _fileLock new object(); // 线程安全锁private const int MaxFiles 100; // 最大文件数限制private const string LogDire…

阿里云镜像加速仅支持阿里云产品了

最近在拉取docker镜像时一直报超时的错误&#xff1a; docker pull hello-world Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exce…

从零实现Git安装、使用

一、git安装 Git官方下载 1.下载exe程序 2.双击安装&#xff0c;一直点击next&#xff0c;默认安装 安装完成后&#xff0c;在任意文件夹右键&#xff0c;出现下图所示&#xff0c;即为安装成功。 3.【Git Bash Here】调出命令窗口&#xff0c;设置用户名和 email 地址。 gi…

生产环境中如何使用Caffeine+Redis实现二级缓存(详细分析了遇到的各种情况)

生产环境中如何使用CaffeineRedis实现二级缓存&#xff08;详细分析了各种情况&#xff09; 本篇主要讲解的是实现CaffeineRedis实现一个现成的使用流程。下一篇讲解什么是Caffeine以及caffeine的使用 00背景&#xff1a; 使用Caffeine和Redis的二级缓存方案源自于分布式系统…

RT-Thread开发文档合集

瑞萨VisionBoard开发实践指南 RT-Thread 文档中心 RT-Thread-【RA8D1-Vision Board】 RA8D1 Vision Board上的USB实践RT-Thread问答社区 - RT-Thread 【开发板】环境篇&#xff1a;05烧录工具介绍_哔哩哔哩_bilibili 【RA8D1-Vision Board】基于OpenMV 实现图像分类_哔哩哔哩_…

甘果桌面tv版下载-甘果桌面安卓电视版使用教程

甘果桌面 TV 版是一款备受关注的应用&#xff0c;它可以让安卓电视的界面更加个性化、操作更加便捷。接下来&#xff0c;我们就详细了解一下甘果桌面 TV 版的下载方法以及安卓电视版的使用教程。 甘果桌面 TV 版下载 打开你的安卓电视&#xff0c;找到并进入电视自带的应用商店…

RAII资源管理理解

基础介绍 RAII (Resource Acquisition Is Initialization) 是一种 C 编程范式&#xff0c;这不是一个语法特性&#xff0c;而是一种处理方式。RAII的思想&#xff1a; 资源获取与对象初始化同时发生资源释放与对象销毁同时发生通过对象的生命周期来管理资源&#xff0c;确保资…

解锁元生代:ComfyUI工作流与云原生后端的深度融合

目录 蓝耘元生代&#xff1a;智算新势力崛起​ ComfyUI 工作流创建详解​ ComfyUI 初印象​ 蓝耘平台上搭建 ComfyUI 工作流​ 构建基础工作流实操​ 代码示例与原理剖析​ 云原生后端技术全景 云原生后端概念解析​ 核心技术深度解读​ 蓝耘元生代中两者的紧密联系​…

实战篇|多总线网关搭建与量产验证(5000 字深度指南)

引言 1. 环境准备与硬件选型 1.1 项目需求分析 1.2 SoC 与开发板选型 1.3 物理接口与 PCB 设计 1.4 电源与供电保护 2. 软件架构与协议栈移植 2.1 分层架构详解 2.2 协议栈移植步骤 2.3 高可用驱动设计 2.4 映射逻辑与 API 定义 3. 开发流程与实践 3.1 敏捷迭代与里程碑 3.2 核…

Kafka安全认证技术:SASL/SCRAM-ACL方案详解

#作者 &#xff1a;张桐瑞 文章目录 1Kafka安全认证技术介绍2基础设置3 配置SASL/SCRAM认证3.1编写server.properties配置3.2编写kafka.conf密码文件3.3编写user.properties配置文件3.4编写kafka-run-class.sh脚本文件3.5Zk中增加kafka用户3.6启动kafka进程 1Kafka安全认证技术…

TCP/IP和UDP协议的发展历程

TCP/IP和UDP协议的发展历程 引言 互联网的发展史是人类技术创新的辉煌篇章&#xff0c;而在这一发展过程中&#xff0c;通信协议发挥了奠基性的作用。TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;作为互联网通信的基础…

PhotoShop学习10

1.画板功能的使用 使用画板功能可以轻松针对不同的设备和屏幕尺寸设计网页和 APP。画板是一种容器&#xff0c;类似于特殊图层组。画板中的图层在图层面板中&#xff0c;按画板进行分组。 使用画板&#xff0c;一个文档中可以有多个设计版面&#xff0c;这样可以在画板之间轻…

X-AnyLabeling开源程序借助 Segment Anything 和其他出色模型的 AI 支持轻松进行数据标记。

一、软件介绍 文末提供源码和程序下载学习 使用 X-AnyLabeling开源程序可以 导入、管理和保存数据。用户可以通过多种方式导入图像和视频文件&#xff0c;包括快捷方式或菜单选项。此外&#xff0c;它还涵盖数据删除、图像切换以及标签和图像数据的保存&#xff0c;以确保高效…