8.redis 数据类型之zset

redis 数据类型之zset

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存在但是不是有序集类型时,返回一个错误。

1
2
3
4
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 命令用于计算集合中元素的数量。

1
2
127.0.0.1:6379> zcard chengji
(integer) 4

zcount

ZCOUNT key min max

zcount 命令用于计算有序集合中指定分数区间的成员数量。

1
2
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不是有序集合类型是,返回一个错误。

分数值可以是整数值或是双精度浮点值。

1
2
3
4
5
6
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命令所描述的相同。

返回值:

有序集合中成员名称 minmax之间的成员数量;integer类型。

1
2
127.0.0.1:6379> zlexcount chengji - +
(integer) 4

zrange

ZRANGE key start stop [WITHSCORES]

zrange 返回有序集中,指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。具有相同分数值的成员按字段序(lexicographical order)来排列。

如果你需要成员按值递减(从大到小)来排列,请使用 zrevrange 命令。

下标参数startstop 都以0 为底,也就是说,以0 表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以-1表示最后一个成员,-2 表示倒数第二个成员,以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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"

从大到小:

1
2
3
4
5
6
7
8
9
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 通过字典区间返回有序集合的成员。(安装字典顺序排列)

1
2
3
4
5
6
7
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 返回有序集合中指定分数区别的成员列表。有序集成员按分数值递增(从小到大)次序排列。

具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加(符号来使用可选的开区间(小于或大于))。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 返回有序集合中指定成员的排名。其中有序集合成员按分数值递增顺序排序。

1
2
3
4
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命令一直。

1
2
3
4
5
6
7
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命令一样、

1
2
3
4
5
6
7
8
9
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命令可以获取成员按分数值递增(从小到大)排列的排名。

1
2
3
4
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。

1
2
127.0.0.1:6379> zscore chengji ooyhao
"100"

返回值:成员的分数值,以字符串形式表示。

zrem

ZREM key member [member ...]

zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当key存在但不是有序集合类型时,返回一个错误。

1
2
3
4
5
6
7
8
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 命令用于移除有序集合中给定的字典区间的所有成员。

1
2
3
4
5
6
7
8
9
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)区间内的所有元素

1
2
3
4
5
6
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)区间内的所有成员

1
2
3
4
5
6
7
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中。

默认情况下,结果集中某一个成员分数值是所有给定集下该成员分数值之和。

1
2
3
4
5
6
7
8
9
10
11
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中。

默认情况下,结果集中某个成员的分数是所有给定集下该成员分数值之和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

更多请移步官网

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×