【Redis技术干货】让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis技术干货】让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】

前言介绍


很多小伙伴都跟我说,redis中,ZSet(有序集合)是他们最陌生的集合,同时也是觉得特别复杂的集合之一,在开发过程中经常会用到它,而且也是大家最不太有把握使用的集合,所以笔者就从ZSet集合开始去讲解Redis的集合的使用指南,希望可以帮助大家!



有序集合


ZSET(有序集合)的概念

有序集合(ZSET):是像集合(SET)一样可以装很多东西,只不过集合装的是字符串而有序集合(ZSET)装的是键值对,从更严谨的角度讲,有序集合和散列更接近只不过有序集合是有序的,有点像TreeSet



ZSET(有序集合)的定义

有序集合(ZSet):它是一个存储着成员(member)本身对象值以及和它对应的分值(score)的键值对,并且按照分值从小到大自动排序。对应的具体的数据结构,


  • 有序集合的键被称为成员(member)每个成员各不相同
  • 有序集合的值被称为分值(score),分值必须是浮点数



ZADD命令:


  • 它的全称叫做:zset add,将给定分值的成员添加到有序集合里面
  • 因为有序集合是自排序的,所以也不像列表一样有左插入或右插入



指令:
# zadd key score value
zadd zset-weight 60 Kelvin
复制代码


java代码
System.out.println(conn.zadd("zset-weight",60,"Kelvin"));
复制代码


作用

往zset-weight这个有序集合中添加Kelvin-60这个键值对


返回


  • “1” 存入成功
  • “0” 存入失败,zset-weight已经存在该键值对



注意


有序集合的不一样的地方就在于,将分值写在前面,因为有序集合是要根据分值来进行排序的,默认从小到大(正序 ASC)


其他案例


zadd zset-weight 40 Lina
zadd zset-weight 50 Oscar
zadd zset-weight 70 Mike
复制代码

执行完了存储,我们接下来,如何删除元素?




ZREM(移除)


ZREM全称zset remove,从有序集合里面移除给定的成员,并返回被移除成员的数量


指令
zrem zset-weight Mike
复制代码


  • 作用:移除zset-weight中键为Mike的元素
  • 返回:"1" 表示移除元素数量为1
System.out.println(conn.zrem("zset-weight","Mike"));
复制代码




ZCARD


ZCARD全称zset card,返回有序集合包含的成员数量


指令
zcard high
复制代码



java代码
System.out.println(conn.zadd("high",180,"Kelvin"));
System.out.println(conn.zadd("high",160,"Lina"));
System.out.println(conn.zadd("high",177,"Mike"));
System.out.println(conn.zcard("high"));
复制代码



zcard命令返回3.


ZINCRBY


ZINCRBY全称zset increase by,将成员的分值加上一个给定数。

System.out.println(conn.zincrby("high",2,"Kelvin"));
复制代码

ZCOUNT


ZCOUNT全称zset count,返回分值在[min,max]之间的成员数量

System.out.println(conn.zcount("high",165,190));
复制代码




ZRANK


ZRANK全称zset rank,返回成员在有序集合中的排名

System.out.println(conn.zrank("high","Kelvin"));
复制代码



ZSCORE


ZSCORE全称zset score,返回成员的分值

System.out.println(conn.zscore("high","Kelvin"));
复制代码

ZRANGE(获取)


  • ZRANGE全称:zset range key start end [WITHSCORES] ,取出zset-weight中索引值在[start,end]之间的成员,即该范围内的键值对,如果给定了可选WITHSCORES的选项,那么命令会将成员的分值也一并返回。
  • 如果希望全部取出来,可以采用start=0,end=-1,可以看出来是一个环路,前开后闭。如果start选择了1,就无法获取第一个,拿出来的数据会少一个!而end=-1 则则说明获取到最后一个


指令:
zrange key start end withscores
zrange zset-weight 0 -1 withscores
复制代码


返回
(1)"Lina"
  (2)"40"
  (3)"Oscar"
  (4)"50"
  (5)"Kelvin"
  (6)"60"
  (7)"Mike"
  (8)"70"
复制代码


我们现在选择选出排名第3到第6之间的数据,(3,6]

System.out.println(conn.zrange("high",3,6));
复制代码


因为zrange的范围是左开右闭,那么如果我们想拿到(3,6]并且拿到这些的分值。

System.out.println(conn.zrangeWithScores("high",3,6));
复制代码

ZRANGEBYSCORE


ZRANGEBYSCORE全称zset range by score,它与zrange相比较区别在于根据分值范围来获取,返回有序集合中分值介于min和max之间的所有成员


需求场景


我们挑出分值在160到180之间的成员


指令
zrangebyscore key start end [withscores]
zrangebyscore zset-weight 160 180 withscores
复制代码


java代码


System.out.println(conn.zrangeByScore("high",160,180));
复制代码



作用


取出分值在[0,60]之间的键值对


返回
(1)"Lina"
  (2)"40"
  (3)"Oscar"
  (4)"50"
  (5)"Kelvin"
  (6)"60"
复制代码

ZREVRANGE


ZREVRANGE全称zset reverse range,返回有序集合给定排名范围内的成员,成员按照分值从大到小排列


指令


zrevrange key start end withscores
zrevrange zset-weight 0 -1 withscores
复制代码
java代码


System.out.println(conn.zrevrange("high",1,5));
复制代码

ZREVRANGEBYSCORE


ZREVRANGEBYSCORE全称·zset reversal range by score,获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回。




指令


倒序获取160到180  的位置,注意此时 180 是开始坐标 160是结束坐标

zrevrangebyscore key start end 
zrevrangebyscore high 180 160
复制代码



Java代码


System.out.println(conn.zrevrangeByScore("high",180,160));
复制代码



ZREVRANK


ZREVRANK全称zset reversal rank,返回成员在有序集合里的排名,按照分值从大到小排列,默认的是从小到大,这里翻转了一下。


假设,“Kelvin”排第6,“Yellow”排第3,但是从逆向来看,“Kelvin”为0,“Yellow”为3,那么我们写行代码查看一下。


System.out.println(conn.zrevrank("high","Yellow"));
System.out.println(conn.zrevrank("high","Kelvin"));
复制代码

ZREMRANGEBYRANK


ZREMRANGEBYRANK全称zset remove range by rank,移除有序集合中排名介于start和stop之间的所有成员


在移除之间先查看一下redis中的数据


运行Java代码
System.out.println(conn.zremrangeByRank("high",2,4));
复制代码

返回被移除的数量



ZREMRANGENYSCORE


ZREMRANGEBYSCORE全称zset remove range by score移除有序集合中排名分值介于start和stop之间的所有成员


为了演示方便,我们将在high有序集合中多添加几行数据

System.out.println(conn.zadd("high",174,"Jay"));
System.out.println(conn.zadd("high",169,"Pei"));
System.out.println(conn.zadd("high",186,"Jone"));
复制代码



然后移除分值170以内的成员

System.out.println(conn.zremrangeByScore("high",0,170));
复制代码



ZINTERSTORE


ZINTERSTORE全称zset inter store,对给定的有序集合做交集运算,默认使用的聚合函数为sum,即默认在做交集操作时将不同集合中相同的成员所对应的分值相加,然后聚合成一个新的有序集合。


ZUNIONSTORE


ZUNIONSTORE全称zset union store,对给定的有序集合做并集运算,同样并集运算的聚合函数也可以选用“max”,"min"和“sum”。为了避免重复性说明,我们选用max来做一次并集示范。




相关实践学习
基于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
相关文章
|
3月前
|
消息中间件 存储 负载均衡
Redis使用ZSET实现消息队列使用总结二
Redis使用ZSET实现消息队列使用总结二
60 0
|
4天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
16 2
|
3天前
|
存储 NoSQL Redis
6)深度解密 Redis 的集合(Set)
6)深度解密 Redis 的集合(Set)
12 1
|
16天前
|
存储 NoSQL Redis
Redis 管道技术
【9月更文挑战第16天】Redis 管道技术通过批量发送命令并一次性读取响应,显著提升了与 Redis 服务器交互的性能。其工作原理包括命令缓冲、批量发送、响应接收与处理。管道技术减少了网络往返次数,提高了资源利用效率,并使代码更简洁。适用于批量操作、高并发环境及复杂业务逻辑等场景,是优化 Redis 应用性能的强大工具。
|
20天前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
56 3
|
3天前
|
存储 NoSQL Redis
10)Redis 的管道技术
10)Redis 的管道技术
11 0
|
3天前
|
存储 NoSQL API
7)深度解密 Redis 的有序集合(ZSet)
7)深度解密 Redis 的有序集合(ZSet)
8 0
|
2月前
|
存储 NoSQL 算法
深入理解Redis数据类型Zset原理
本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
深入理解Redis数据类型Zset原理
|
2月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
25天前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
下一篇
无影云桌面