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

Redis 中的 Zset 数据结构详解

目录

用法

1. 增

2. 删

3. 查

4. 交,并

编码方式 

应用场景


Redis 中的 Zset(有序集合)是一种将元素按照分数进行排序的数据结构。与上篇写的SetRedis 中的 Set 数据结构详解不同,Zset 中的每个元素都关联一个浮点数类型的分数。


用法

常见命令

1. 增

添加或者更新

ZADD key [ NX | XX ] [ GT | LT ] [ CH ] [ INCR ] score member [score member ...]
注意:
XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
NX:仅⽤于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。

2. 删

删除指定的元素。

ZREM key member [member ...]

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

ZPOPMAX key [count]

ZPOPMAX 的阻塞版本。 

BZPOPMAX key [key ...] timeout

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

ZPOPMIN key [count]

ZPOPMIN 的阻塞版本。 

BZPOPMIN key [key ...] timeout

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

ZREMRANGEBYRANK key start stop

按照分数删除指定范围的元素,左闭右闭。 

ZREMRANGEBYSCORE key min max

3. 查

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

ZCARD key

返回分数在 min 和 max之间的元素个数

 ZCOUNT key min max

返回指定区间里的元素,分数按照升序(带上 WITHSCORES 可以把分数也返回)

ZRANGE key start stop [WITHSCORES] 

 返回指定元素的排名,升序。

ZRANK key member

返回指定元素的排名,降序。 

ZREVRANK key member

返回指定元素的分数。  

ZSCORE key member

4. 交,并

交集

求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]]
[AGGREGATE <SUM | MIN | MAX>]

并集 

求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]

编码方式 

ziplist(压缩列表):当有序集合中的元素数量较少且每个元素都比较小(总大小不超过 64 个字节,元素数量不超过 128 个)时,Redis 使用紧凑的 ziplist 结构。ziplist 是一种连续内存块,可以有效减少内存占用。

skiplist(跳表):当有序集合变大或元素变复杂时,Redis 会自动切换到 skiplist 编码。skiplist 是一种跳表(就是复杂的链表,一个节点上可能有多个指针)结构,适合快速的范围查询和插入操作。


应用场景

热搜 / 排行榜:Zset 非常适合用于实现排行榜系统,例如游戏中的积分排行榜、博客系统中的热门文章排行榜。通过 ZADD 插入或更新用户分数,通过 ZRANGEZREVRANGE 获取排名。

1. 添加用户赞数

 zadd user:ranking:2024-05-25 3 llt

     如果再获得赞,可以使⽤ zincrby:

zincrby user:ranking:2024-05-15 1 llt

2.  取消用户点赞

zrem user:ranking:2024-05-25 tom

3. 展示获取赞数最多的 10 个用户

zrevrangebyrank user:ranking:2022-03-15 0 9

4. 展示用户信息以及用户分数

hgetall user:info:tom
zscore user:ranking:2022-03-15 mike
zrank user:ranking:2022-03-15 mike

延迟队列:可以利用 Zset 实现延迟队列,任务按延迟时间排序。将任务的执行时间作为分数,通过 ZRANGEBYSCORE 获取到期的任务。

推荐系统:在推荐系统中,可以使用 Zset 维护用户的行为分数(如点击、点赞等),并根据分数进行排序推荐。

相关文章:

  • C++系列——————类和对象(上)
  • 固定翼飞机(固定翼飞行器)种类丰富 国家政策推动行业发展速度加快
  • 基于FreeRTOS+STM32CubeMX+LCD1602+MCP6S28的8通道模拟可编程增益放大器Proteus仿真
  • 什么是AVIEXP提前发货通知?
  • 供应黑烟识别器公司哪家强?
  • 【mysql】ubuntu下安装数据库
  • 【React篇】组件错误边界处理(组件错误引起的页面白屏)
  • 智狐联创-AI知识库:AI数字化转型的领航者
  • 【linux深入剖析】进程间通信
  • Spark 核心编程之 RDD 介绍
  • 独家首发 | 基于 KAN、KAN卷积的轴承故障诊断模型
  • 【SpringMVC】_简单示例计算器
  • PMP认证与NPDP认证哪个含金量高?
  • Redis 和 Mysql 如何保证两者数据一致性
  • Android下HWC以及drm_hwcomposer普法(下)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaWeb(学习笔记二)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • PHP那些事儿
  • python学习笔记 - ThreadLocal
  • rc-form之最单纯情况
  • windows下使用nginx调试简介
  • XML已死 ?
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 对JS继承的一点思考
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前端自动化解决方案
  • 手机端车牌号码键盘的vue组件
  • 小程序button引导用户授权
  • 以太坊客户端Geth命令参数详解
  • 智能网联汽车信息安全
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2)STM32单片机上位机
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (SpringBoot)第二章:Spring创建和使用
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (篇九)MySQL常用内置函数
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .htaccess配置常用技巧
  • .net FrameWork简介,数组,枚举
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net反混淆脱壳工具de4dot的使用
  • @Autowired @Resource @Qualifier的区别
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Transactional 竟也能解决分布式事务?
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • []使用 Tortoise SVN 创建 Externals 外部引用目录