一、前言
有序集合存储着成员(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高级程序开发微信公众号