写点什么

🚄【Redis 干货领域】让你彻底会使用“Redis 中最陌生且最强大的集合”(ZSET)【上部】

发布于: 5 小时前
🚄【Redis 干货领域】让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【上部】

前言介绍

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

有序集合

ZSET(有序集合)的概念

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

ZSET(有序集合)的定义

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


  • 有序集合的键被称为成员(member)每个成员各不相同

  • 有序集合的值被称为分值(score),分值必须是浮点数

ZADD 命令:

  • 它的全称叫做:zset add,将给定分值的成员添加到有序集合里面

  • 因为有序集合是自排序的,所以也不像列表一样有左插入或右插入

指令:
# zadd key score valuezadd 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 Linazadd zset-weight 50 Oscarzadd 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 withscoreszrange 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 withscoreszrevrange 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 来做一次并集示范。

发布于: 5 小时前阅读数: 9
用户头像

🏆2021年InfoQ写作平台-签约作者 🏆 2020.03.25 加入

👑【酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“】 🏅 【Java技术领域,MySQL技术领域,APM全链路追踪技术及微服务、分布式方向的技术体系等】 “任何足够先进的技术都是魔法“

评论

发布
暂无评论
🚄【Redis 干货领域】让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【上部】