redis 数据类型之zset
原文:https://ooyhao.github.io/categories/DB/Redis/
zset简介
有序集合和集合一样,也是string类型元素的集合,且不允许重复的成员。不同的是每一个元素都会关联一个double类型的分数。redis正式通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)是可以相同的。集合是通过哈希表是实现的,所以添加,删除,查找的复杂度都是O(1).集合中的最大成员数为2^32-1 (4294967295,每个集合可存储40多亿个成员)。
命令集合
zadd
ZADD key score1 member1 [score2 member2]
注意:在redis2.4之前,zadd一次只能添加一个元素。
zadd 命令用于将一个或多个成员元素及其分数值加入到有序集合中。如果当某一个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。分数值可以是整数值或双精度浮点数。
如果有序集合key不存在,则会创建一个空的有序集并执行zadd命令操作。当key存在但是不是有序集类型时,返回一个错误。
127.0.0.1:6379> zadd chengji 98 zhangsan
(integer) 1
127.0.0.1:6379> zadd chengji 99 lisi 97 wangwu 100 ooyhao
(integer) 3
zcard
ZCARD key
zcard 命令用于计算集合中元素的数量。
127.0.0.1:6379> zcard chengji
(integer) 4
zcount
ZCOUNT key min max
zcount 命令用于计算有序集合中指定分数区间的成员数量。
127.0.0.1:6379> zcount chengji 97 99
(integer) 3
zincrby
ZINCRBY key increment member
zincrby 命令对有序集合中指定成员的分数加上增量increment。可以通过传递一个负数值increment。让分数减去相应的数值。
- 当key不存在,或者分数不是key的成员时。zincrby key increment member 等同于 zadd key increment member.
- 当key不是有序集合类型是,返回一个错误。
分数值可以是整数值或是双精度浮点值。
127.0.0.1:6379> zincrby chengji 2 lisi
"101"
127.0.0.1:6379> zincrby chengji -3 lisi
"98"
127.0.0.1:6379> zincrby chengji 0.5 lisi
"98.5"
zlexcount
ZLEXCOUNT key min max
zlexcount 命令在计算有序集合中指定字典区间内成员数量。
说明:
- 成员名称前需要加
[
符号作为开头,[
符号与成员之间不能有空格。 - 可以使用
-
和+
表示得分最小值和最大值 - min 和 max 不能反,max放前面min放后面会导致返回结果为0.
- 计算成员之间的成员数量时,参数min和max的位置也计算在内。
- min和max参数的含义与zrangebylex命令所描述的相同。
返回值:
有序集合中成员名称 min
和 max
之间的成员数量;integer类型。
127.0.0.1:6379> zlexcount chengji - +
(integer) 4
zrange
ZRANGE key start stop [WITHSCORES]
zrange 返回有序集中,指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。具有相同分数值的成员按字段序(lexicographical order)来排列。
如果你需要成员按值递减(从大到小)来排列,请使用 zrevrange
命令。
下标参数start
和 stop
都以0 为底,也就是说,以0 表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以-1表示最后一个成员,-2 表示倒数第二个成员,以此类推。
127.0.0.1:6379> zrange chengji 0 -1
1) "wangwu"
2) "zhangsan"
3) "lisi"
4) "ooyhao"
127.0.0.1:6379> zrange chengji 0 -1 withscores
1) "wangwu"
2) "97"
3) "zhangsan"
4) "98"
5) "lisi"
6) "98.5"
7) "ooyhao"
8) "100"
从大到小:
127.0.0.1:6379> zrevrange chengji 0 -1 withscores
1) "ooyhao"
2) "100"
3) "lisi"
4) "98.5"
5) "zhangsan"
6) "98"
7) "wangwu"
8) "97"
zrangebylex
ZRANGEBYLEX key min max [LIMIT offset count]
zrangebylex 通过字典区间返回有序集合的成员。(安装字典顺序排列)
127.0.0.1:6379> zrangebylex chengji - [c
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrangebylex chengji - (c
1) "a"
2) "b"
zrangebyscore
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
min 和 max 可以使用 -inf 和 +inf,这样一来,你就可以在不知道有序集的最低和最高score值的情况下,使用zrangebyscore 命令。
zrangebyscore 返回有序集合中指定分数区别的成员列表。有序集成员按分数值递增(从小到大)次序排列。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加(符号来使用可选的开区间(小于或大于))。
127.0.0.1:6379> zrangebyscore chengji -inf +inf withscores
1) "a"
2) "96"
3) "b"
4) "97"
5) "c"
6) "98"
7) "d"
8) "99"
9) "e"
10) "100"
11) "f"
12) "101"
127.0.0.1:6379> zrangebyscore chengji 97 99 withscores
1) "b"
2) "97"
3) "c"
4) "98"
5) "d"
6) "99"
zrank
zrank 返回有序集合中指定成员的排名。其中有序集合成员按分数值递增顺序排序。
127.0.0.1:6379> zrank chengji c
(integer) 2
127.0.0.1:6379> zrank chengji a
(integer) 0
zrevrange
ZREVRANGE key start stop [WITHSCORES]
zrevrange 命令返回有序集中,指定区间内的成员。其中成员的位置按分数值递减(从大到小)来排列。
具有相同分数值的成员按照字段序的逆序(reverse lexicographical order) 排列,除了成员按分数值递减的次序排列这一点外,zrevrange命令的其他方面和zrange命令一直。
127.0.0.1:6379> zrevrange chengji 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
zrevrangebyscore
ZREVRANGEBYSCORE key max min [WITHSCORES]
zrevrangebyscore 返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。具有相同分数值的成员按字典的逆序(reverse lexicographical order)排列。除了成员按分数值递减的次序排列这一点外,zrevrangebyscore命令的其他方面和zrangebyscore命令一样、
127.0.0.1:6379> zrevrangebyscore chengji 100 97 withscores
1) "e"
2) "100"
3) "d"
4) "99"
5) "c"
6) "98"
7) "b"
8) "97"
zrevrank
ZREVRANK key member
zrevrank 命令返回有序集中成员的排名。其中有序集成员分数值递减(从大到小)排序。排名以0位底,也就是说,分数值最大的成员排名是0.使用zrank命令可以获取成员按分数值递增(从小到大)排列的排名。
127.0.0.1:6379> zrank chengji f
(integer) 5
127.0.0.1:6379> zrevrank chengji f
(integer) 0
zscore
zscore 命令返回有序集中,成员的分数值。如果成员元素不是有序集key的成员,或key不存在,返回nil。
127.0.0.1:6379> zscore chengji ooyhao
"100"
返回值:成员的分数值,以字符串形式表示。
zrem
ZREM key member [member ...]
zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当key存在但不是有序集合类型时,返回一个错误。
127.0.0.1:6379> zrem chengji a
(integer) 1
127.0.0.1:6379> zrange chengji 0 -1
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
zremrangebylex
ZREMRANGEBYLEX key min max
zremrangebylex 命令用于移除有序集合中给定的字典区间的所有成员。
127.0.0.1:6379> zremrangebylex chengji [d [f
(integer) 3
127.0.0.1:6379> zrange chengji 0 -1 withscores
1) "a"
2) "96"
3) "b"
4) "97"
5) "c"
6) "98"
zremrangebyrank
ZREMRANGEBYRANK key start stop
zremrangebyrank 命令用于移除有序集中,指定排名(rank)区间内的所有元素
127.0.0.1:6379> zremrangebyrank chengji 0 2
(integer) 3
127.0.0.1:6379> zrange chengji 0 -1
1) "d"
2) "e"
3) "f"
zremrangebyscore
ZREMRANGEBYSCORE key min max
zremrangebyscore 命令用于移除有序集中,指定分数(score)区间内的所有成员
127.0.0.1:6379> zremrangebyscore chengji 96 97
(integer) 2
127.0.0.1:6379> zrange chengji 0 -1
1) "c"
2) "d"
3) "e"
4) "f"
sinterstore
ZINTERSTORE destination numkeys key [key ...]
zinterstore 命令计算给定的一个或多个有序集的交集,其中给定的key的数量必须以numkeys参数指定,并将该交集(结果集)存储到destination中。
默认情况下,结果集中某一个成员分数值是所有给定集下该成员分数值之和。
127.0.0.1:6379> zadd chengji1 97 a 98 b 99 c 101 d
(integer) 4
127.0.0.1:6379> zadd chengji2 99 c 100 d 101 e 102 f
(integer) 4
127.0.0.1:6379> zinterstore chengji3 2 chengji1 chengji2
(integer) 2
127.0.0.1:6379> zrange chengji3 0 -1 withscores
1) "c"
2) "198"
3) "d"
4) "201"
zunionstore
ZUNIONSTORE destination numkeys key [key ...]
zunionstore 命令计算给定的一个或多个有序集合的并集,其中给定key的数量必须以numkeys参数指定,并将该并集(结果集)存储到destination中。
默认情况下,结果集中某个成员的分数是所有给定集下该成员分数值之和。
127.0.0.1:6379> zunionstore chengji4 2 chengji1 chengji2
(integer) 6
127.0.0.1:6379> zrange chengji4 0 -1 withscores
1) "a"
2) "97"
3) "b"
4) "98"
5) "e"
6) "101"
7) "f"
8) "102"
9) "c"
10) "198"
11) "d"
12) "201"
redis的zset集合就介绍这么多了。
本文参考自菜鸟教程:https://www.runoob.com/redis/redis-sorted-sets.html
更多请移步官网