详谈redis之有序集合(ZSET)

一、前言

有序集合存储着成员(member)和分值(score)的键值对,按照分值从小到大自动排序,具体细节在第一篇blog《详谈redis数据结构》中,不太熟悉的同学可以回去查看。对Java不太熟悉的同学可关注文章末尾的公众号,里面满满干货。

二、命令

2.1 ZADD

ZADD全称zset add
将给定分值的成员添加到有序集合里面

System.out.println(conn.zadd("high",180,"Kelvin"));

查看redis中,已存储该条数据
在这里插入图片描述

2.2 ZREM

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

System.out.println(conn.zrem("high","Kelvin"));

在这里插入图片描述

2.3 ZCARD

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

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.

2.4 ZINCRBY

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

System.out.println(conn.zincrby("high",2,"Kelvin"));

在这里插入图片描述

2.5 ZCOUNT

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

System.out.println(conn.zcount("high",165,190));

在这里插入图片描述

2.6 ZRANK

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

System.out.println(conn.zrank("high","Kelvin"));

在这里插入图片描述

2.7 ZSCORE

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

System.out.println(conn.zscore("high","Kelvin"));

在这里插入图片描述

2.8 ZRANGE

ZRANGE全称zset range
返回有序集合中排名介于[start,stop]之间的成员,如果给定了可选的WITHSCORES选项,那么命令会将成员的分值也一并返回。

为了使我们的有序集合更具有可操作性,先添加一些成员。

//先将high有序集合扩充一下
System.out.println(conn.zadd("high",155,"Jin"));
System.out.println(conn.zadd("high",161,"Yellow"));
System.out.println(conn.zadd("high",172,"Lucy"));

查看redis里面high有序集合存储的信息
在这里插入图片描述
OK,我们现在选择选出身高排名第3到第6之间的同学,(3,6]

System.out.println(conn.zrange("high",3,6));

在这里插入图片描述
由结果得知,zrange的范围是左开右闭。

那么如果我们想拿到(3,6]并且拿到这些同学的分值

System.out.println(conn.zrangeWithScores("high",3,6));

在这里插入图片描述

2.9 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"));

在这里插入图片描述

2.10 ZREVRANGE

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

System.out.println(conn.zrevrange("high",1,5));

在这里插入图片描述
ZREVRANGEWITHSCORES
返回有序集合给定排名范围内的成员,并显示分值,成员按照分值从大到小排列

System.out.println(conn.zrevrangeWithScores("high",1,5));

在这里插入图片描述

2.11 ZRANGEBYSCORE

ZRANGEBYSCORE全称zset range by score
返回有序集合中分值介于min和max之间的所有成员
我们挑出分值在160到180之间的成员

System.out.println(conn.zrangeByScore("high",160,180));

在这里插入图片描述

2.12 ZREVRANGEBYSCORE

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

System.out.println(conn.zrevrangeByScore("high",180,160));

在这里插入图片描述

2.13 ZREMRANGEBYRANK

ZREMRANGEBYRANK全称zset remove range by rank
移除有序集合中排名介于start和stop之间的所有成员
在移除之间先查看一下redis中的数据
在这里插入图片描述
运行代码

System.out.println(conn.zremrangeByRank("high",2,4));

返回被移除的数量
在这里插入图片描述
再次查看redis中的数据
在这里插入图片描述

2.14 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));

在这里插入图片描述

2.15 ZINTERSTORE

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

先创建两个有序集合

System.out.println(conn.zadd("zset-key1",1,"a"));
System.out.println(conn.zadd("zset-key1",2,"b"));
System.out.println(conn.zadd("zset-key1",3,"c"));
System.out.println(conn.zadd("zset-key2",10,"b"));
System.out.println(conn.zadd("zset-key2",20,"c"));
System.out.println(conn.zadd("zset-key2",30,"d"));

很明显zset-key1和zset-key2的共同成员有"b"和"c",新建一个有序集合用来做两者的交集。

System.out.println(conn.zinterstore("zset-key3","zset-key1","zset-key2"));

在这里插入图片描述
很明显交集就是将两者的共同成员所对应的分值相加。

那么如果我们选用聚合函数MAX,就是在取交集时,选用相同成员中分值较高者为交集的分值要怎么操作呢

ZParams zParams = new ZParams();
zParams.aggregate(ZParams.Aggregate.MAX);
System.out.println(conn.zinterstore("zset-key4",zParams,"zset-key1","zset-key2"));

查看redis中的数据
在这里插入图片描述
同理,如果选用min做为聚合参数,则将代码稍作修改即可

ZParams zParams = new ZParams();
zParams.aggregate(ZParams.Aggregate.MIN);
System.out.println(conn.zinterstore("zset-key3",zParams,"zset-key1","zset-key2"));

在这里插入图片描述

2.16 ZUNIONSTORE

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

ZParams zParams = new ZParams();
zParams.aggregate(ZParams.Aggregate.MAX);
System.out.println(conn.zunionstore("zset-key5",zParams,"zset-key1","zset-key2"));

在这里插入图片描述

总结

redis的五种数据类型的相关命令已经介绍完毕,接下去还会介绍一些redis中常用的其他命令,比如发布与订阅,键过期时间等等。

对Java系列知识感兴趣的朋友可以加入QQ群
慧梦软件开发技术联盟:952317701
更多系列文章在java高级程序开发微信公众号
Java高级开发技术

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页