Redis之Sorted Set数据类型API及应用场景解析(二)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
全局流量管理 GTM,标准版 1个月
简介: Redis之Sorted Set数据类型API及应用场景解析

1.16 ZREMRANGEBYSCORE(zremrangebyscore)

移除有序集合中给定的分数区间的所有成员


移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。 自版本2.1.6开始,score值等于min或max的成员也可以不包括在内,语法请参见ZRANGEBYSCORE命令。


语法


127.0.0.1:6379> ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]


可以版本:>= 2.2.0


返回值:删除的元素的个数。


案例


127.0.0.1:6379> flushall        #清空数据库
OK
127.0.0.1:6379> zadd myzset 1 one 2 two 3 three  #添加数据
(integer) 3
127.0.0.1:6379> zremrangebyscore myzset 1 2   #随机移除分数再1到2闭区间得数值
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1 withscores  #遍历集合
1) "three"
2) "3"
127.0.0.1:6379>


1.17 ZREVRANGE(zrevrange)

返回有序集中指定区间内的成员,通过索引,分数从高到底


Redis Zrevrange 命令返回有序集中,指定区间内的成员。


其中成员的位置按分数值递减(从大到小)来排列。


具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列。


除了成员按分数值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。


语法


127.0.0.1:6379> ZREVRANGE key start stop [WITHSCORES]


可以版本:>= 1.2.0


返回值:指定区间内,带有分数值(可选)的有序集成员的列表。


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd chengji 98 j3_liuliang 89 xiaohong 67 huazai 79 axiang
(integer) 4
127.0.0.1:6379> zrange chengji 0 -1 withscores    #由小到大
1) "huazai"
2) "67"
3) "axiang"
4) "79"
5) "xiaohong"
6) "89"
7) "j3_liuliang"
8) "98"
127.0.0.1:6379> zrevrange chengji 0 -1 withscores  #由大到小
1) "j3_liuliang"
2) "98"
3) "xiaohong"
4) "89"
5) "axiang"
6) "79"
7) "huazai"
8) "67"
127.0.0.1:6379>


1.18 ZREVRANGEBYLEX(zrevrangebylex)

移除有序集合中给定的字典区间的所有成员


ZREMRANGEBYLEX 删除名称按字典由低到高排序成员之间所有成员。

不要在成员分数不同的有序集合中使用此命令, 因为它是基于分数一致的有序集合设计的,如果使用,会导致删除的结果不正确。

待删除的有序集合中,分数最好相同,否则删除结果会不正常。


语法


127.0.0.1:6379> ZREMRANGEBYLEX key min max


可以版本:>= 2.8.9


返回值:被成功移除的成员的数量,不包括被忽略的成员。


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g 0 h 0 i 0 j 0 k 0 m 0 b #添加数据
(integer) 12
127.0.0.1:6379> zrange myzset 0 -1    #遍历集合数据
 1) "a"
 2) "b"
 3) "c"
 4) "d"
 5) "e"
 6) "f"
 7) "g"
 8) "h"
 9) "i"
10) "j"
11) "k"
12) "m"
127.0.0.1:6379> zremrangebylex myzset [c [h  #移除指定区间数据
(integer) 6
127.0.0.1:6379> zrange myzset 0 -1
1) "a"
2) "b"
3) "i"
4) "j"
5) "k"
6) "m"
127.0.0.1:6379>



1.19 ZREVRANGEBYSCORE(zrevrangebyscore)

返回有序集中指定分数区间内的成员,分数从高到低排序


Redis Zrevrangebyscore 返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。


具有相同分数值的成员按字典序的逆序(reverse lexicographical order )排列。


除了成员按分数值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE命令一样。


语法


127.0.0.1:6379> ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]


可以版本:>= 2.2.0


返回值:指定区间内,带有分数值(可选)的有序集成员的列表。


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd myzset 200 a 156 b 789 c 2 d 18 e 90 f #添加元素
(integer) 6
127.0.0.1:6379> zrevrangebyscore myzset +inf -inf   #由大到小排列数据
1) "c"
2) "a"
3) "b"
4) "f"
5) "e"
6) "d"
127.0.0.1:6379> zrevrangebyscore myzset 200 0    #返回200 到 0 之间得数据
1) "a"
2) "b"
3) "f"
4) "e"
5) "d"
127.0.0.1:6379>


1.20 ZREVRANK(zrevrank)

返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序


Redis Zrevrank 命令返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。


排名以 0 为底,也就是说, 分数值最大的成员排名为 0 。


使用 ZRANK 命令可以获得成员按分数值递增(从小到大)排列的排名。


语法


127.0.0.1:6379> ZREVRANK key member


可以版本:>= 2.2.0


返回值:如果成员是有序集 key 的成员,返回成员的排名。 如果成员不是有序集 key 的成员,返回 nil 。


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd gongzi 20000 j3_liuliang 15000 laoli 10000 ahua 16000 xiaoming #添加数据
(integer) 4
127.0.0.1:6379> zrevrank gongzi j3_liuliang  #工资最高
(integer) 0
127.0.0.1:6379> zrevrank gongzi ahua    #工资第四
(integer) 3
127.0.0.1:6379>



1.21 ZSCAN(zscan)

迭代有序集合中的元素(包括元素成员和元素分值)


Redis Zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)


语法


127.0.0.1:6379> redis 127.0.0.1:6379> ZSCAN key cursor [MATCH pattern] [COUNT count]


可以版本:>= 2.8.0


返回值:返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。


案例


 
         


可以参考:SCAN及相关SSCAN,HSCAN和ZSCAN命令解析


1.22 ZSCORE(zscore)

返回有序集中,成员的分数值


返回有序集key中,成员member的score值。


如果member元素不是有序集key的成员,或key不存在,返回nil。


语法


127.0.0.1:6379> ZSCORE key member


可以版本:>= 1.2.0


返回值:成员的分数值,以字符串形式表示。


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd gongzi 20000 j3_liuliang 15000 laoli 10000 ahua 16000 xiaoming #添加数据
(integer) 4
127.0.0.1:6379> zscore gongzi j3_liuliang  #返回j3_liuliang得工资(字符串)
"20000"
127.0.0.1:6379>


1.23 ZUNIONSTORE(zunionstore)

计算给定的一个或多个有序集的并集,并存储在新的 key 中


计算给定的numkeys个有序集合的并集,并且把结果放到destination中。在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。 默认情况下,结果集中某个成员的score值是所有给定集下该成员score值之和。


使用WEIGHTS选项,你可以为每个给定的有序集指定一个乘法因子,意思就是,每个给定有序集的所有成员的score值在传递给聚合函数之前都要先乘以该因子。如果WEIGHTS没有给定,默认就是1。


使用AGGREGATE选项,你可以指定并集的结果集的聚合方式。默认使用的参数SUM,可以将所有集合中某个成员的score值之和作为结果集中该成员的score值。如果使用参数MIN或者MAX,结果集就是所有集合中元素最小或最大的元素。


如果key destination存在,就被覆盖。


语法


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


可以版本:>= 2.0.0


返回值:保存到 destination 的结果集的成员数量。


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd gongzi01 20000 j3_liuliang 15000 laoli 10000 ahua 16000 xiaoming  #添加数据
(integer) 4
127.0.0.1:6379> zadd gongzi02 40000 a 30000 b 20000 c 32000 d
(integer) 4
127.0.0.1:6379> zrange gongzi01 0 -1 withscores   #查看集合数据
1) "ahua"
2) "10000"
3) "laoli"
4) "15000"
5) "xiaoming"
6) "16000"
7) "j3_liuliang"
8) "20000"
127.0.0.1:6379> zrange gongzi02 0 -1 withscores
1) "c"
2) "20000"
3) "b"
4) "30000"
5) "d"
6) "32000"
7) "a"
8) "40000"
127.0.0.1:6379> zunionstore gongzi 2 gongzi01 gongzi02 weights 2 1  #将多个集合数据合并到一个集合中,并且第一个集合得分数乘余2 第二                  个乘余1之后再放入目标集合
(integer) 8
127.0.0.1:6379> zrange gongzi 0 -1 withscores #查看目标集合数据
 1) "ahua"
 2) "20000"
 3) "c"
 4) "20000"
 5) "b"
 6) "30000"
 7) "laoli"
 8) "30000"
 9) "d"
10) "32000"
11) "xiaoming"
12) "32000"
13) "a"
14) "40000"
15) "j3_liuliang"
16) "40000"
127.0.0.1:6379


1.24 BZPOPMIN(bzpopmin)

BZPOPMIN 是有序集合命令 ZPOPMIN带有阻塞功能的版本。


在参数中的所有有序集合均为空的情况下,阻塞连接。参数中包含多个有序集合时,按照参数中key的顺序,返回第一个非空key中分数最小的成员和对应的分数


参数 timeout 可以理解为客户端被阻塞的最大秒数值,0 表示永久阻塞。


详细说明请参照BLPOP 说明文档,BZPOPMIN适用有序集合类型的key,BLPOP适用列表类型的key,除此之外,两条命令无其他差别。


语法


 
         


可以版本:>=5.0.0


返回值:


当有序集合无结果返回且超时设置过期时返回 nil


返回三元素multi-bulk结果,第一元素key名称,第二元素成员名称,第三元素分数


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd myzset 100 a 45 b 95 c 58 d  #添加数据
(integer) 4
127.0.0.1:6379> zrange myzset 0 -1 withscores  #遍历数据
1) "b"
2) "45"
3) "d"
4) "58"
5) "c"
6) "95"
7) "a"
8) "100"
127.0.0.1:6379> bzpopmin myzset myzset01 0  #阻塞式将最小分数数据弹出并添加到目标集合中
1) "myzset"
2) "b"
3) "45"



1.25 BZPOPMAX(bzpopmax)

BZPOPMAX 是有序集合命令 ZPOPMAX带有阻塞功能的版本。


在参数中的所有有序集合均为空的情况下,阻塞连接。参数中包含多个有序集合时,按照参数中key的顺序,返回第一个非空key中分数最大的成员和对应的分数


参数 timeout 可以理解为客户端被阻塞的最大秒数值,0 表示永久阻塞。


详细说明请参照BZPOPMIN 说明文档,BZPOPMAX返回非空有序集合 key中分数最大的成员,而BZPOPMIN返回该key中分数最小的成员,除此之外,两条命令无其他差别。


语法


可以版本:>=5.0.0


返回值:


当有序集合无结果返回且超时设置过期时返回 nil


返回三元素multi-bulk结果,第一元素key名称,第二元素成员名称,第三元素分数


案例


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd myzset 100 a 45 b 95 c 58 d
(integer) 4
127.0.0.1:6379> zrange myzset
(error) ERR wrong number of arguments for 'zrange' command
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "b"
2) "45"
3) "d"
4) "58"
5) "c"
6) "95"
7) "a"
8) "100"
127.0.0.1:6379> bzpopmax myzset myzset01 0  #阻塞式将最大分数数据弹出并添加到目标集合中
1) "myzset"
2) "a"
3) "100"
127.0.0.1:6379>


二、应用场景


2.1 排行榜

相信大家对排行榜都不陌生吧!玩过游戏的肯定都知道游戏中的积分排行榜,购物的销量排行榜,微博的热搜排行榜等这些在某个时间点跟新数据的排行变化都可以用Redis的有序集合做。但对于一些实时性比较强的,需要及时更新数据,可以利用redis的有序队列实现;


如图CSDN的周排行榜(不知道博主我什么时候可以上榜,嘻嘻):


微信图片_20220425162414.png


既然看了这个图,那我简单的来写个案例:


127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd rankingList 830 yigechunvzuo 564 leesinDong 556 aobing 543 beilianhua 538 east 529 woshizengxiaogao
(integer) 6                             #博客排名排行榜
127.0.0.1:6379> zrevrange rankingList 0 -1 withscores       #排行榜列表
 1) "yigechunvzuo"
 2) "830"
 3) "leesinDong"
 4) "564"
 5) "aobing"
 6) "556"
 7) "beilianhua"
 8) "543"
 9) "east"
10) "538"
11) "woshizengxiaogao"
12) "529"
127.0.0.1:6379> zadd rankingList 600 j3_liuliang          #现在j3_liuliang这个博主加入到排行榜中
(integer) 1
127.0.0.1:6379> zrevrange rankingList 0 -1 withscores       #排行版变化,j3_liuliang周排行二,嘻嘻!
 1) "yigechunvzuo"
 2) "830"
 3) "j3_liuliang"
 4) "600"
 5) "leesinDong"
 6) "564"
 7) "aobing"
 8) "556"
 9) "beilianhua"
10) "543"
11) "east"
12) "538"
13) "woshizengxiaogao"
14) "529"
127.0.0.1:6379> 


结束语


  • 本文结合Redis中文网和博主的实践案例所写,到此基本数据类型写完了下面开始写三种特殊数据类型
  • 由于博主才疏学浅,难免会有纰漏,假如你发现了错误或偏见的地方,还望留言给我指出来,我会对其加以修正。
  • 如果你觉得文章还不错,你的转发、分享、点赞、留言就是对我最大的鼓励。
  • 感谢您的阅读,十分欢迎并感谢您的关注。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
15天前
|
PHP 开发者
PHP 7新特性深度解析与实践应用
【9月更文挑战第17天】本文将深入探讨PHP 7的新特性及其对开发者的实际影响,同时通过实例演示如何有效利用这些特性优化代码和提高性能。我们将从类型声明的增强开始,逐步深入到其他关键改进点,最后通过一个综合案例展示如何将这些新特性应用于日常开发中。
|
13天前
|
传感器 C# Android开发
深度解析Uno Platform中的事件处理机制与交互设计艺术:从理论到实践的全方位指南,助您构建响应迅速、交互流畅的跨平台应用
Uno Platform 是一款开源框架,支持使用 C# 和 XAML 开发跨平台原生 UI 应用,兼容 Windows、iOS、Android 及 WebAssembly。本文将介绍 Uno Platform 中高效的事件处理方法,并通过示例代码展示交互设计的核心原则与实践技巧,帮助提升应用的用户体验。事件处理让应用能响应用户输入,如点击、触摸及传感器数据变化。通过 XAML 或 C# 添加事件处理器,可确保及时反馈用户操作。示例代码展示了一个按钮点击事件处理过程。此外,还可运用动画和过渡效果进一步增强应用交互性。
122 57
|
4天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
6天前
|
数据可视化 Python
Python绘制基频曲线——实例解析与应用探讨
Python绘制基频曲线——实例解析与应用探讨
30 9
|
3天前
|
存储 NoSQL Redis
6)深度解密 Redis 的集合(Set)
6)深度解密 Redis 的集合(Set)
12 1
|
10天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
32 6
|
6天前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
7天前
|
JavaScript 前端开发 UED
Javaweb中Vue指令的详细解析与应用
Vue指令是Vue框架中非常强大的特性之一,它提供了一种简洁、高效的方式来增强HTML元素和组件的功能。通过合理使用这些指令,可以使你的JavaWeb应用更加响应用户的操作,提高交互性和用户体验。而且,通过创建自定义指令,你可以进一步扩展Vue的功能,使其更贴合你的应用需求。
11 1
|
15天前
|
搜索推荐 安全 API
京东商品详情的 API 探秘与应用
在数字化商业时代,准确详尽的商品信息至关重要。京东作为国内领先电商平台,提供了丰富的商品资源及强大的API接口,涵盖商品查询、订单管理等方面,助力开发者轻松获取商品详情。本文将详细介绍如何使用京东API获取商品信息,并探讨其在数据分析、比价工具及个性化推荐系统中的应用价值。使用时需注意API调用频率、数据时效性及安全性等问题。
|
3天前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
10 0

推荐镜像

更多
下一篇
无影云桌面