各位大佬晚上好,今天我们来学习下Redis的有序集合Zset(sorted set)。Zset和Set一样也是 string 类型元素的集合,且不允许重复的成员。其特性跟Set类似,也是通过哈希表实现的,所以添加、删除、查找都非常高效,复杂度都是 O(1)。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。正是因为这一特性,所以Zset很适合用于统计排行榜这一场景。
Zset的成员是唯一的,但其分数(score)是可以重复的。
简单的了解Zset后,接下来我们看看其常用的一些命令:
1、ZADD key [NX|XX] [CH] [INCR] score member [score member ...]:用于将一个或多个成员元素及其分数值加入到有序集当中。这里我们先讲下这些参数: NX、XX、CH、INCR。
- NX:不更新存在的成员。只添加新成员;
- XX:仅仅更新存在的成员,不添加新成员;
- CH:修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内;
- INCR:当ZADD指定这个选项时,成员的操作就等同于ZINCRBY命令,对成员的分数进行递增操作。
接下来我们使用ZADD命令添加一个key:
127.0.0.1:6379> ZADD key1 80 test1 90 test2
(integer) 2
127.0.0.1:6379> ZRANGE key1 0 -1 WITHSCORES
1) "test1"
2) "80"
3) "test2"
4) "90"
接下来我们使用NX参数来操作下key1,我们使用ZRANGE命令发现test1的score并没有改变。
127.0.0.1:6379> ZADD key1 NX 70 test1 60 test3
(integer) 1
127.0.0.1:6379> ZRANGE key1 0 -1 WITHSCORES
1) "test3"
2) "60"
3) "test1"
4) "80"
5) "test2"
6) "90"
其他的参数各位大佬们可以自己操作下,这里就不做演示了。
2、ZCARD key:用于计算获取有序集合的成员数量。
127.0.0.1:6379> ZCARD key1
(integer) 3
3、ZRANGE key start stop [WITHSCORES]:通过索引区间按分数值递增(从小到大)来排序,返回有序集合指定区间内的成员。WITHSCORES为可选参数,带该参数时会返回成员的score。
注意:具有相同分数值的成员按字典序来排列。
127.0.0.1:6379> ZRANGE key1 0 -1
1) "test3"
2) "test1"
3) "test2"
127.0.0.1:6379> ZRANGE key1 0 -1 WITHSCORES
1) "test3"
2) "60"
3) "test1"
4) "80"
5) "test2"
6) "90"
4、ZCOUNT key min max:计算在有序集合中指定区间分数的成员数量。
127.0.0.1:6379> ZCOUNT key1 80 100
(integer) 2
5、ZINCRBY key increment member:对指定成员的分数加上增量 increment。
当成员不存在时,新增加一个成员,其分数(score)即为increment。
127.0.0.1:6379> ZRANGE key1 0 -1
(empty list or set)
127.0.0.1:6379> ZINCRBY key1 30 test1
"30"
127.0.0.1:6379> ZRANGE key1 0 -1 WITHSCORES
1) "test1"
2) "30"
127.0.0.1:6379> ZINCRBY key1 50 test1
"80"
127.0.0.1:6379> ZRANGE key1 0 -1 WITHSCORES
1) "test1"
2) "80"
6、ZLEXCOUNT key min max:计算指定字典区间内成员数量。
min和max两个参数,需要使用符号"("和"[":
- (m