「重复率问题-修订版」Redis技术专题系列之让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)前篇
Posted 洛神灬殇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「重复率问题-修订版」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 testkey 30 valuekey
java代码
System.out.println(conn.zadd("testkey",60,"valuekey"));
作用
往testkey这个有序集合中添加valuekey-60这个键值对
返回
- “1” 存入成功
- “0” 存入失败,testkey已经存在该键值对
注意
有序集合的不一样的地方就在于,将分值写在前面,因为有序集合是要根据分值来进行排序的,默认从小到大(正序 ASC)
其他案例
zadd testkey 40 valuekey
执行完了存储,我们接下来,如何删除元素?
ZREM(移除)
ZREM全称zset remove,从有序集合里面移除给定的成员,并返回被移除成员的数量
指令
zrem testKey testValue
- 作用:移除testKey中键为testValue的元素
- 返回:“1” 表示移除元素数量为1
System.out.println(conn.zrem("testKey","testValue"));
ZCARD
ZCARD全称zset card,返回有序集合包含的成员数量
指令
zcard testKey
java代码
System.out.println(conn.zadd("testKey",180,"testKey1"));
System.out.println(conn.zadd("testKey",160,"testKey2"));
System.out.println(conn.zadd("testKey",177,"testKey3"));
System.out.println(conn.zcard("testKey"));
zcard命令返回3.
ZINCRBY
ZINCRBY全称zset increase by,将成员的分值加上一个给定数。
System.out.println(conn.zincrby("testKey",2,"testValue"));
ZCOUNT
ZCOUNT全称zset count,返回分值在[min,max]之间的成员数量
System.out.println(conn.zcount("testKey",165,190));
ZRANK
ZRANK全称zset rank,返回成员在有序集合中的排名
System.out.println(conn.zrank("testKey","testValue"));
ZSCORE
ZSCORE全称zset score,返回成员的分值
System.out.println(conn.zscore("testKey","testValue"));
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)"testValue1"
(2)"40"
(3)"testValue2"
(4)"50"
(5)"testValue3"
(6)"60"
(7)"testValue4"
(8)"70"
我们现在选择选出排名第3到第6之间的数据,(3,6]
System.out.println(conn.zrange("testKey",3,6));
因为zrange的范围是左开右闭,那么如果我们想拿到(3,6]并且拿到这些的分值。
System.out.println(conn.zrangeWithScores("testKey",3,6));
ZRANGEBYSCORE
ZRANGEBYSCORE全称zset range by score,它与zrange相比较区别在于根据分值范围来获取,返回有序集合中分值介于min和max之间的所有成员
需求场景
我们挑出分值在160到180之间的成员
指令
zrangebyscore key start end [withscores]
zrangebyscore testKey 160 180 withscores
java代码
System.out.println(conn.zrangeByScore("testKey",160,180));
作用
取出分值在[0,60]之间的键值对
返回
(1)"testKey1"
(2)"40"
(3)"testKey2"
(4)"50"
(5)"testKey3"
(6)"60"
ZREVRANGE
ZREVRANGE全称zset reverse range,返回有序集合给定排名范围内的成员,成员按照分值从大到小排列
指令
zrevrange key start end withscores
zrevrange testKey 0 -1 withscores
java代码
System.out.println(conn.zrevrange("testKey",1,5));
ZREVRANGEBYSCORE
ZREVRANGEBYSCORE全称·
zset reversal range by score
,获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回。
指令
倒序获取160到180 的位置,注意此时 180 是开始坐标 160是结束坐标
zrevrangebyscore key start end
zrevrangebyscore testKey 180 160
Java代码
System.out.println(conn.zrevrangeByScore("testKey",180,160));
ZREVRANK
ZREVRANK全称zset reversal rank,返回成员在有序集合里的排名,按照分值从大到小排列,默认的是从小到大,这里翻转了一下。
假设,“testValue0”排第6,“testValue1”排第3,但是从逆向来看,“testValue1”为0,“testValue0”为3,那么我们写行代码查看一下。
System.out.println(conn.zrevrank("testKey","testValue0"));
System.out.println(conn.zrevrank("testKey","testValue1"));
ZREMRANGEBYRANK
ZREMRANGEBYRANK全称zset remove range by rank,移除有序集合中排名介于start和stop之间的所有成员
在移除之间先查看一下redis中的数据
运行Java代码
System.out.println(conn.zremrangeByRank("testKey",2,4));
返回被移除的数量
ZREMRANGENYSCORE
ZREMRANGEBYSCORE全称zset remove range by score移除有序集合中排名分值介于start和stop之间的所有成员
为了演示方便,我们将在testKey有序集合中多添加几行数据
System.out.println(conn.zadd("testKey",174,"testValue1"));
System.out.println(conn.zadd("testKey",169,"testValue2"));
System.out.println(conn.zadd("testKey",186,"testValue3"));
然后移除分值170以内的成员
System.out.println(conn.zremrangeByScore("testKey",0,170));
ZINTERSTORE
ZINTERSTORE全称zset inter store,对给定的有序集合做交集运算,默认使用的聚合函数为sum,即默认在做交集操作时将不同集合中相同的成员所对应的分值相加,然后聚合成一个新的有序集合。
ZUNIONSTORE
ZUNIONSTORE全称zset union store,对给定的有序集合做并集运算,同样并集运算的聚合函数也可以选用“max”,"min"和“sum”。为了避免重复性说明,我们选用max来做一次并集示范。
以上是关于「重复率问题-修订版」Redis技术专题系列之让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)前篇的主要内容,如果未能解决你的问题,请参考以下文章
面试者推荐 |Redis面试专题「常见问答系列」透析Redis常见技术相关的问题1~10题(进阶)