当前位置: 首页 > 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 维护用户的行为分数(如点击、点赞等),并根据分数进行排序推荐。

http://www.lryc.cn/news/358637.html

相关文章:

  • Python网页处理与爬虫实战:使用Requests库进行网页数据抓取
  • HOW - vscode 使用指南
  • 刚刚!《国家科学技术奖励条例》迎来最新修订
  • MySQL -- SQL笔试题相关
  • VB6 MQTT为什么在物联网应用中使用 MQTT 而不是 HTTP?
  • 软设之希尔排序
  • WPF Binding对象
  • Educational Codeforces Round 127 D. Insert a Progression
  • 树莓集团:构筑全国数字影像生态链
  • 物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机
  • Elasticsearch 认证模拟题 -2
  • Java-----Comparable接口和Comparator接口
  • 通信技术体会
  • Linux系统安全及其应用
  • JVM内存划分类加载的过程双亲委派模型的详解
  • Java异常详解
  • C++入门3——类与对象2(类的6个默认成员函数)
  • CobaltStrike基本渗透
  • 【linux深入剖析】进程间通信
  • 关系数据库:关系模式
  • 医学图像处理质量的评价方法
  • Ehcache Java 缓存框架
  • 详解Spring IoCDI(二)
  • 说明白计算机网络之TCP的流量控制与拥塞控制之慢开始算法与拥塞避免算法
  • 这款信创FTP软件,可实现安全稳定的文件传输
  • 代码随想录算法训练营第十天|232.用栈实现队列、225. 用队列实现栈
  • STM32 IIC协议
  • Java生成随机数的几种方式
  • 【面试】什么是Java虚拟机
  • Go 语言的基本构成、要素与编写规范