redis中的zset数据类型的基本操作
1、首先连上你的redis
以下一些命令很简单,或者执行命令后效果也无法体现的就没有进行截图展示
2、zset相关操作
说明:redis的zset是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。集合中最大的成员数为2^32-1(4294967295,每个集合可以存储40多亿个成员)。
-------------------增、删、改、查操作开始------------------
Sorted Set命令一览:
1、ZADD
向有序集合中添加一个或多个成员:zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
- [NX|XX]:NX=Not exist,当成员不存在时,才进行添加,不会进行更新已经存在的成员。XX=already exist。仅仅进行更新已存在的成员,不会新增新的成员
- [GT|LT]:选项要求Redis版本要 >= 6.2。
GT:greater than,表示新分数大于当前分数时才更新元素分值,但是该参数并不会影响新增成员。
LT:less than,表示新分数小于当前分数时才更新元素分值,同样,该参数并不会影响新增成员。 - [CH]:在默认情况下,ZADD命令将返回成功添加的新成员数据作为返回值,而CH参数则表示会返回被修改成员的数量作为返回值,被修改成员包括新添加的成员以及分值被更新的成员。
- [INCR]:zadd 指令不再是设置,而是增加分数。此参数可用另一个命令代替:ZINCRBY(给key中一个成员添加分数)
实践:zadd ball 300 basketball 400 football 200 volleyball 100 tennisball
[NX|XX]实践:
zadd ball nx 80 tennisball 60 ping-pong-ball
说明:tennisball(网球)并没有被修改,而ping-pong-ball被加入到集合中
[NX|XX]实践:
zadd ball xx 80 tennisball 50 baseball
说明:baseball(棒球)并没有被加入到集合中,而tennisball(网球)的分数被修改了。此时命令返回值为0,因为默认情况下,ZADD命令将返回成功添加的新成员数据作为返回值。
[GT|LT]实践:
zadd ball gt 50 baseball 70 tennisball
说明:因为tennisball的70不大于原本的80,所以并不进行更新,但是新增的baseball不受影响,如期加入了集合中。
[GT|LT]实践:
zadd ball lt 60 baseball 40 snooker
说明:因为baseball的60不小于原本的50,所以并不进行更新,但是新增的snooker(斯诺克)不受影响,如期加入了集合中。
[GT|LT]实践:
zadd ball lt 60 baseball 40 snooker
说明:因为baseball的60不小于原本的50,所以并不进行更新,但是新增的snooker(斯诺克)不受影响,如期加入了集合中。
[incr]实践:
zadd ball incr 10 football
说明:更新某个成员的分数
2、ZRANGE
获取key中给定索引范围内的成员:zrange key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
- start stop:索引范围,且start、stop都为闭区间,比如start=0,stop=-1 => 代表获取集合内的所有成员。
- [BYSCORE|BYLEX]:BYSCORE:通过分数进行排序获取,BYLEX:lexicographical ordering,通过字典顺序进行排序获取。
当获取信息选择BYSCORE或BYLEX时,start与stop将转变成获取的min与max,用作取值范围,参考以下几个示例。
min与max的值有以下四种情景:
带有 [ 符号的值表示结果中包含与给定值具有同等字典序大小的成员
带有 ( 符号表示在不结果中不包含与给定值具有同等字典序大小的成员
加号 + 表示无穷大
减号 - 表示无穷小
- [REV]:reverse(反转),意思就是按照原有顺序的反顺序进行排序展示。
- [LIMIT offset count]:分页展示,offset:偏移量。count:要获取的条数。
- [WITHSCORES]:展示的时候带上分数值
[BYSCORE|BYLEX]实践:
zrange ball 80 410 byscore
说明:byscore时,start与stop都是闭区间。
[BYSCORE|BYLEX]实践:
zrange letter [a [d bylex
说明:[代表闭区间,所以取的是a到b闭区间内的所有元素
[REV]实践:
zrange ball 410 (80 byscore rev
说明:如果执行rev,则min与max的顺序将调转,需要先给出max,再给出min。语法可见:zrange key max min byscore rev
[LIMIT offset count]实践:
zrange ball 40 410 byscore limit 0 2
说明:limit只能使用在BYSCORE或BYLEX的环境下。limit可实现限制获取的元素个数。
3、ZREVRANGE
作用:返回指定key中索引范围内的成员,顺序由高到底。
语法:zrevrange key start stop [WITHSCORES]
说明:zrange + rev可实现此命令同样效果。
4、ZRANGEBYLEX
作用:按照字典顺序进行排序后获取指定区间的成员,且可以进行分页。
语法:zrangebylex key min max [LIMIT offset count]
说明:zrange + bylex可实现此命令同样效果。
5、ZREVRANGEBYLEX
作用:用法与ZRANGEBYLEX类似,只是顺序是反的
语法:zrevrangebylex key max min [LIMIT offset count]
说明:zrange + bylex + rev可实现此命令同样效果。
6、ZRANGEBYSCORE
作用:按照分数顺序进行排序后获取指定区间的成员,且可以进行分页。
语法:zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
说明:zrange + byscore可实现此命令同样效果。
7、ZREVRANGEBYSCORE
作用:用法与ZRANGEBYSCORE类似,只是顺序是反的。
语法:zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
说明:zrange + byscore + rev可实现此命令同样效果。
8、ZINCRBY
作用:给key中的成员增加分数
语法:zincrby ball increment member
说明:zadd + incr可实现此命令同样效果。
9、ZCARD
作用:获取指定key中的成员数量。
语法:zcard key
10、ZCOUNT
作用:获取指定 key 下分数范围内的成员的数量。
语法:zcount key min max
11、ZPOPMAX
作用:返回指定 key 的分数最大的 N 个成员,并将返回的成员从 key 中删除。
语法:zpopmax key [count]
12、ZPOPMIN
作用:返回指定 key 的分数最小的 N 个成员,并将成员从 key 中删除。
语法:zpopmin key [count]
13、ZLEXCOUNT
作用:返回成员之间的数量。
语法:zlexcount key min max
14、ZRANK
作用:按照分数由低到高的顺序查看成员的排名。
语法:zrank key member
实践:zrank ball baseball。查看baseball的分数由低到高的顺序排名
15、ZREVRANK
作用:按照分数由高到低的顺序查看成员的排名。
语法:zrevrank key member
实践:zrank ball baseball。查看baseball的分数由高到低的顺序排名
16、ZREM
作用:删除 zset 中的一个或多个成员,当成员为空时,删除该 key。
语法:zrem key member [member ...]
17、ZREMRANGEBYRANK
作用:按照排名进行删除成员。
语法:zremrangebyrank key start stop
实践:删除排名0,1的两个成员:zremrangebyrank ball 0 1
18、ZREMRANGEBYSCORE
作用:按照分数进行删除成员。
语法:zremrangebyscore key min max
实践:删除分数80到200的成员:zremrangebyscore ball 80 200
19、ZREMRANGEBYLEX
作用:按照字典顺序进行删除成员。
语法:zremrangebylex key min max
实践:删除字典c到k的成员:zremrangebylex letter [c [k
20、ZSCORE
作用:获取指定成员的分数。
语法:zscore key member
-------------------增、删、改、查操作结束------------------
-------------------交集、并集操作开始------------------
1、ZINTERSCORE
作用:将两个或多个 zset 求交集,并存在destination中。
语法:zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
[WEIGHTS weight [weight ...]]:权重,当交集元素进行合并时,可以按照权重来取分数
[AGGREGATE SUM|MIN|MAX]:聚合,zinterstore默认就是SUM相加的方式
实践:zinterstore k3 2 k1 k2。下图中可知,交集元素的分数会合并。
[WEIGHTS weight [weight ...]]实践:
zinterstore k4 2 k1 k2 weights 2 3
说明:求k1、k2的交集,并取k1的权重为2,k2的权重为3。
计算权重:k4(aa) = k1(aa) * 2 + k2(aa) * 3 = 100 * 2 + 100 * 3 = 500
[AGGREGATE SUM|MIN|MAX]实践:
zinterstore k5 2 k1 k2 aggregate sum
说明:求k1、k2的交集,聚合方式为相加,及k1的分数加上k2的分数。
[AGGREGATE SUM|MIN|MAX]实践:
zinterstore k5 2 k1 k2 aggregate min
说明:求k1、k2的交集,聚合方式为取最小,及k1的分数与k2的分数中最小的那个。
[AGGREGATE SUM|MIN|MAX]实践:
zinterstore k5 2 k1 k2 aggregate max
说明:求k1、k2的交集,聚合方式为取最大,及k1的分数与k2的分数中最大的那个。
2、ZUNIONSCORE
作用:将两个或多个 zset 求并集,并存在destination中。
语法:zunionstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
说明:用法与zinterstore一致
-------------------交集、并集操作结束------------------
参考文献:https://cloud.tencent.com/developer/article/1690154?from=15425