Redis 有序集合

 

有序集合?

Redis的有序集合中,每个成员有两个属性。

一个是这个成员的名:MEMBER_NAME;

一个是这个成员的值:MEMBER_SCORE。

 

1、ZADD 命令


用于将带有给定分值的成员添加到有序集合里面。

如果输入的成员存在于该有序集合,并且该成员分值发生变化时,则更新这个分值。

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

如果指定的有序集合不存在,则创建一个空的有序集合执行ZADD操作。

127.0.0.1:6379> ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

例如,

127.0.0.1:6379> ZADD KEY 1 "A"
(integer) 1
127.0.0.1:6379> ZADD KEY 2 "B"
(integer) 1
127.0.0.1:6379> ZRANGE KEY 0 -1
1) "A"
2) "B"
127.0.0.1:6379> ZRANGE KEY 0 -1 withscores
1) "A"
2) "1"
3) "B"
4) "2"

2、ZCARD 命令


用于返回有序集合包含的成员数量。

127.0.0.1:6379> ZCARD KEY

例如,

127.0.0.1:6379> ZCARD KEY
(integer) 2
127.0.0.1:6379> ZCARD KEY
(integer) 2
127.0.0.1:6379> ZADD ZSET 1.0 "A"
(integer) 1
127.0.0.1:6379> ZADD ZSET 2.0 "B"
(integer) 1
127.0.0.1:6379> ZADD ZSET 3.0 "C"
(integer) 1
127.0.0.1:6379> ZCARD ZSET
(integer) 3

3、ZCOUNT 命令


用于返回分值介于MIN和MAX之间的成员数量。

127.0.0.1:6379> ZCOUNT KEY MIN MAX 

例如,

127.0.0.1:6379> ZADD ZSET 1.0 "A"
(integer) 1
127.0.0.1:6379> ZADD ZSET 2.0 "B"
(integer) 1
127.0.0.1:6379> ZADD ZSET 3.0 "C"
(integer) 1
127.0.0.1:6379> ZCARD ZSET
(integer) 3
127.0.0.1:6379> ZCOUNT ZSET 1 3
(integer) 3
127.0.0.1:6379> ZCOUNT ZSET 1.2 2.5
(integer) 1
127.0.0.1:6379> ZCOUNT ZSET 0.8 2.5
(integer) 2

4、ZINCRBY 命令


用于对有序集合中指定成员的分值加上指定的增量(Increment)。

增量可以正数或负数,为负数的情况时,表示相应的成员的分值减去该增量。

如果指定的KEY不存在,执行该命令会创建一个名为KEY的有序集合。

如果指定的KEY不是一个有序集合时,返回一个错误说明。

127.0.0.1:6379> ZINCRBY KEY INCREMENT MEMBER 

例如,

127.0.0.1:6379> ZINCRBY ZSET 5 "A"
"11"
127.0.0.1:6379> ZRANGE ZSET 0 -1 withscores
1) "B"
2) "2"
3) "C"
4) "3"
5) "A"
6) "11"
127.0.0.1:6379> ZINCRBY ZSET 5 B
"7"
127.0.0.1:6379> ZRANGE ZSET 0 -1 withscores
1) "C"
2) "3"
3) "B"
4) "7"
5) "A"
6) "11"

5、ZINTERSTORE 命令


用于对给定的有序集合执行交集运算,运算结果集存储到DESTINATION中。

其中,有序集合通过KEY指定;有序集合的数量通过NUMKEY指定。

WEIGHTS选项,用于指定一个乘法因子,有序集合中每个成员的SCORE值乘以该因子后,结果传递给聚合函数。并且,乘法因子的设置需要根据有序集合的个数分别指定。默认为1。

AGGREGATE选项,用于指定该交集的结果集的聚合方式。默认使用的是SUM。

127.0.0.1:6379> ZINTERSTORE DESTINATION NUMKEY key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

例如,

127.0.0.1:6379> ZADD MIDD_EXAM 80 A 76 B 59 C
(integer) 3
127.0.0.1:6379> ZADD FINA_EXAM 91 A 80 B 63 C 70 D
(integer) 4
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
(empty list or set)
127.0.0.1:6379> ZINTERSTORE SUM 2 MIDD_EXAM FINA_EXAM WEIGHTS 1 1 AGGREGATE SUM
(integer) 3
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
1) "C"
2) "122"
3) "B"
4) "156"
5) "A"
6) "171"

 

127.0.0.1:6379> ZADD MIDD_TEST 77 "A"
(integer) 1
127.0.0.1:6379> ZADD MIDD_TEST 90 "B"
(integer) 1
127.0.0.1:6379> ZADD MIDD_TEST 83 "C"
(integer) 1
127.0.0.1:6379> ZADD FINA_TEST 67 "A"
(integer) 1
127.0.0.1:6379> ZADD FINA_TEST 84 "B"
(integer) 1
127.0.0.1:6379> ZADD FINA_TEST 78 "C"
(integer) 1
127.0.0.1:6379> ZINTERSTORE SUM 2 MIDD_TEST FINA_TEST
(integer) 3
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
1) "A"
2) "144"
3) "C"
4) "161"
5) "B"
6) "174"
127.0.0.1:6379> ZINTERSTORE SUM 2 MIDD_TEST FINA_TEST AGGREGATE MIN
(integer) 3
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
1) "A"
2) "67"
3) "C"
4) "78"
5) "B"
6) "84"
127.0.0.1:6379> ZINTERSTORE SUM 2 MIDD_TEST FINA_TEST WEIGHTS 1 2
(integer) 3
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
1) "A"
2) "211"
3) "C"
4) "239"
5) "B"
6) "258"

6、ZLEXCOUNT 命令


当指定的有序集合所有成员都具有相同的分值时,该命令用于计算有序集合中指定成员之间的成员数量。

KEY指定有序集合名称。成员介于MIN与MAX范围内的元素数量。

MIN指定有序集合中分数排名较小的成员。

MAX指定有序集合中分数排名较大的成员。

输入成员是需要以'['或者'('开头。[表示闭区间,(表示开区间。

注:这个是我比较困惑的函数之一!

127.0.0.1:6379> ZLEXCOUNT KEY MIN MAX 

例如,

127.0.0.1:6379> ZADD EXAM 0 A 0 B 0 C
(integer) 3
127.0.0.1:6379> ZLEXCOUNT EXAM - +
(integer) 3
127.0.0.1:6379> ZLEXCOUNT EXAM [A +
(integer) 3
127.0.0.1:6379> ZLEXCOUNT EXAM [B +
(integer) 2
127.0.0.1:6379> ZLEXCOUNT EXAM [C +
(integer) 1
127.0.0.1:6379> ZLEXCOUNT EXAM [C [C
(integer) 1
127.0.0.1:6379> ZLEXCOUNT EXAM [C (C
(integer) 0

如果给定的有序集合成员的分数不一致,则返回的结果未知。

127.0.0.1:6379> ZADD EXAM 70 A 90 B 80 C
(integer) 3
127.0.0.1:6379> ZLEXCOUNT EXAM  [A +
(integer) 3
127.0.0.1:6379> ZLEXCOUNT EXAM  [B +
(integer) 2
127.0.0.1:6379> ZLEXCOUNT EXAM  [C +
(integer) 0
127.0.0.1:6379> ZLEXCOUNT EXAM  [C [B
(integer) 0
127.0.0.1:6379> ZLEXCOUNT EXAM  [C [C
(integer) 0
127.0.0.1:6379> ZRANGELEX EXAM  [C [C

7、ZRANGE 命令


用于返回有序集合中排名介于START和STOP之间的成员,如果给定了可选的WITHSCORES选项,成员的分值也一并返回。

返回的结果集是按照分数值递增的方式排列。具有相同分数的成员,按照名称的字典顺序排列。

如果需要逆序排列,参考ZRECRANGE命令。

127.0.0.1:6379> ZRANGE KEY START STOP [WITHSCORES]

例如,

127.0.0.1:6379> ZRANGE EXAM 0 -1
1) "A"
2) "B"
3) "C"
127.0.0.1:6379> ZRANGE EXAM 0 -1 WITHSCORES
1) "A"
2) "0"
3) "B"
4) "0"
5) "C"
6) "0"
127.0.0.1:6379> ZRANGE EXAM 0 10000 WITHSCORES
1) "A"
2) "0"
3) "B"
4) "0"
5) "C"
6) "0"
127.0.0.1:6379> ZRANGE EXAM 10 10000 WITHSCORES
(empty list or set)

8、ZRANGEBYLEX 命令


当指定的有序集合所有成员都具有相同的分值时,该命令用于计算有序集合中指定成员集合。

KEY指定有序集合名称。成员介于MIN与MAX范围内的元素数量。

输入成员是需要以'['或者'('开头。[表示闭区间,(表示开区间。

LIMIT选项用于获取指定范围内的匹配元素。

127.0.0.1:6379> ZRANGEBYLEX KEY MIN MAX [LIMIT offset count]

例如,

127.0.0.1:6379> ZADD EXAM 0 A 0 B 0 C 0 D 0 E 0 F
(integer) 6
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "A"
2) "B"
3) "C"
4) "D"
5) "E"
6) "F"
127.0.0.1:6379> ZRANGEBYLEX EXAM - + LIMIT 3 2
1) "D"
2) "E"

如果给定的有序集合成员的分数不一致,RANGE函数会先按照分数进行排序,然后在进行选取成员。

127.0.0.1:6379> ZADD EXAM 0 A 1 B 0 C 1 D 0 E 1 F
(integer) 6
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "A"
2) "C"
3) "E"
4) "B"
5) "D"
6) "F"
127.0.0.1:6379> ZRANGEBYLEX EXAM - + LIMIT 3 2
1) "B"
2) "D"

9、ZRANGEBYSCORE 命令


用于返回有序集合中,分数介于MIN和MAX之间的所有成员。

有序成员按照分值从小到大依次排列。具有相同分值的成员按字典序来排列。

默认区间的取值使用闭区间,可以使用(来指定使用开区间。

127.0.0.1:6379> ZRANGEBYSCORE KEY MIN MAX [WITHSCORES] [LIMIT offset count]

例如,

127.0.0.1:6379> ZRANGEBYSCORE EXAM 1 2
(empty list or set)
127.0.0.1:6379> ZRANGEBYSCORE EXAM 1 100
1) "A"
2) "B"
3) "C"
4) "E"
5) "D"
6) "F"
127.0.0.1:6379> ZRANGEBYSCORE EXAM 1 100 WITHSCORES
 1) "A"
 2) "10"
 3) "B"
 4) "20"
 5) "C"
 6) "30"
 7) "E"
 8) "40"
 9) "D"
10) "50"
11) "F"
12) "60"
127.0.0.1:6379> ZRANGEBYSCORE EXAM 1 100 WITHSCORES LIMIT 3 2
1) "E"
2) "40"
3) "D"
4) "50"

10、ZRANK 命令


用于返回成员MEMBER在有序集合中的排名。

127.0.0.1:6379> ZRANK KEY MEMBER 

例如,

127.0.0.1:6379> ZRANK EXAM A
(integer) 0
127.0.0.1:6379> ZRANK EXAM B
(integer) 1
127.0.0.1:6379> ZRANK EXAM C
(integer) 2
127.0.0.1:6379> ZRANK EXAM D
(integer) 4
127.0.0.1:6379> ZRANGE EXAM 0 -1 WITHSCORES
 1) "A"
 2) "10"
 3) "B"
 4) "20"
 5) "C"
 6) "30"
 7) "E"
 8) "40"
 9) "D"
10) "50"
11) "F"
12) "60"

11、ZREM 命令


用于从有序集合里移除给定的成员,并返回备移除成员的数量。

如果指定的KEY不是一个有序集合是,返回一个错误说明。

127.0.0.1:6379> ZREM KEY MEMBER [member ...]

例如,

127.0.0.1:6379> ZRANGE EXAM 0 -1 WITHSCORES
 1) "A"
 2) "10"
 3) "B"
 4) "20"
 5) "C"
 6) "30"
 7) "E"
 8) "40"
 9) "D"
10) "50"
11) "F"
12) "60"
127.0.0.1:6379> ZREM EXAM A C E G
(integer) 3
127.0.0.1:6379> ZRANGE EXAM 0 -1 WITHSCORES
1) "B"
2) "20"
3) "D"
4) "50"
5) "F"
6) "60"

12、ZREMRANGEBYLEX 命令


用于移除按字典由低到高排序成员之间的所有成员。

不要在成员分数不同的有序集合中使用此命令,如果使用会导致删除的结果不正确。

注意:

  • 有序集合中的分值必须相同!
  • 成员顺序按照成员字符串对应二进制数组字节数进行比较。
  • 默认使用ASCII码,不建议使用UTF扩展字符集。
127.0.0.1:6379> ZREMRANGEBYLEX KEY MIN MAX 

例如,

127.0.0.1:6379> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1
(integer) 12
127.0.0.1:6379> ZRANGEBYLEX zset + -
(empty list or set)
127.0.0.1:6379> ZRANGEBYLEX zset - +
 1) "a"
 2) "aa"
 3) "abc"
 4) "apple"
 5) "b"
 6) "c"
 7) "d"
 8) "d1"
 9) "dd"
10) "dobble"
11) "z"
12) "z1"
127.0.0.1:6379> ZREMRANGEBYLEX zset [a [f
(integer) 10
127.0.0.1:6379> ZRANGEBYLEX zset - +
1) "z"
2) "z1"

如果指定有序集合中成员的分值不同时,好像也没什么太大关系

127.0.0.1:6379> ZADD EXAM 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I
(integer) 9
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "A"
2) "B"
3) "C"
4) "D"
5) "E"
6) "F"
7) "G"
8) "H"
9) "I"
127.0.0.1:6379> ZREMRANGEBYLEX EXAM [C [G
(integer) 5
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "A"
2) "B"
3) "H"
4) "I"

如果分值不是按照顺序来设置,那问题就大了!

127.0.0.1:6379> ZADD EXAM 10 A 10000 B 200 C 30000 D 40 E 5 F 60 G 700 H 8 I
(integer) 9
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "F"
2) "I"
3) "A"
4) "E"
5) "G"
6) "C"
7) "H"
8) "B"
9) "D"
127.0.0.1:6379> ZREMRANGEBYLEX EXAM [C [H
(integer) 1
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "I"
2) "A"
3) "E"
4) "G"
5) "C"
6) "H"
7) "B"
8) "D"
127.0.0.1:6379> ZRANGE EXAM 0 -1 WITHSCORES
 1) "I"
 2) "8"
 3) "A"
 4) "10"
 5) "E"
 6) "40"
 7) "G"
 8) "60"
 9) "C"
10) "200"
11) "H"
12) "700"
13) "B"
14) "10000"
15) "D"
16) "30000"

13、ZREMRANGEBYRANK 命令


用于移除有序集合中排名介于START和STOP之间的所有成员。

这里给定的区间是成员所在的下标,而不是分值的取值区间。

127.0.0.1:6379> ZREMRANGEBYRANK KEY START STOP 

例如,

127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "I"
2) "A"
3) "E"
4) "G"
5) "C"
6) "H"
7) "B"
8) "D"
127.0.0.1:6379> ZREMRANGEBYRANK EXAM 100 10000
(integer) 0
127.0.0.1:6379> ZREMRANGEBYRANK EXAM 3 6
(integer) 4
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "I"
2) "A"
3) "E"
4) "D"

14、ZREMRANGEBYSCORE 命令


用于移除有序集合中分值介于MIN与MAX之间的所有成员。

默认使用闭区间,如果使用开区间,在前门加(。

127.0.0.1:6379> ZREMRANGEBYSCORE KEY MIN MAX 

例如,

127.0.0.1:6379> ZADD EXAM 10 A 10000 B 200 C 30000 D 40 E 5 F 60 G 700 H 8 I
(integer) 9
127.0.0.1:6379> ZRANGE EXAM 0 -1 WITHSCORES
 1) "F"
 2) "5"
 3) "I"
 4) "8"
 5) "A"
 6) "10"
 7) "E"
 8) "40"
 9) "G"
10) "60"
11) "C"
12) "200"
13) "H"
14) "700"
15) "B"
16) "10000"
17) "D"
18) "30000"
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "F"
2) "I"
3) "A"
4) "E"
5) "G"
6) "C"
7) "H"
8) "B"
9) "D"
127.0.0.1:6379> ZREMRANGEBYSCORE EXAM 1000 10000
(integer) 1
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "F"
2) "I"
3) "A"
4) "E"
5) "G"
6) "C"
7) "H"
8) "D"
127.0.0.1:6379> ZREMRANGEBYSCORE EXAM (40 1000
(integer) 3
127.0.0.1:6379> ZRANGEBYLEX EXAM - +
1) "F"
2) "I"
3) "A"
4) "E"
5) "D"

15、ZREVRANGE 命令


用于返回有序集合给定排名范围内的成员,成员按照分值从大到小排列。

具有相同分值的成员按字典序的逆序排列。

127.0.0.1:6379> ZREVRANGE KEY START STOP [WITHSCORES]

例如,

127.0.0.1:6379> ZREVRANGE EXAM 0 -1
1) "D"
2) "E"
3) "A"
4) "I"
5) "F"
127.0.0.1:6379> ZREVRANGE EXAM 0 -1 WITHSCORES
 1) "D"
 2) "30000"
 3) "E"
 4) "40"
 5) "A"
 6) "10"
 7) "I"
 8) "8"
 9) "F"
10) "5"
127.0.0.1:6379> ZREVRANGE EXAM -1 0
(empty list or set)

16、ZREVRANGEBYSCORE 命令


用于获取有序集合中分值介于MIN和MAX之间的所有成员,并按照分值从大到小的顺序累返回。

具有相同分值的成员按字典序的逆序排列。

127.0.0.1:6379> ZREVRANGEBYSCORE KEY MAX MIN [WITHSCORES] [LIMIT offset count]

例如,

127.0.0.1:6379> ZREVRANGEBYSCORE EXAM 1000 10 WITHSCORES
1) "E"
2) "40"
3) "A"
4) "10"
127.0.0.1:6379> ZREVRANGE EXAM 0 -1 WITHSCORES
 1) "D"
 2) "30000"
 3) "E"
 4) "40"
 5) "A"
 6) "10"
 7) "I"
 8) "8"
 9) "F"
10) "5"
127.0.0.1:6379> ZREVRANGEBYSCORE EXAM 1000 10 WITHSCORES
1) "E"
2) "40"
3) "A"
4) "10"
127.0.0.1:6379> ZREVRANGEBYSCORE EXAM 1000 10 WITHSCORES LIMIT 0 1
1) "E"
2) "40"

17、ZREVRANK 命令


用于返回有序集合里成员MEMBER的排名,成员排名按照分值从大到小排列。

如果给定的成员不存在,则返回nil。

127.0.0.1:6379> ZREVRANK KEY MEMBER 

例如,

127.0.0.1:6379> ZREVRANGEBYLEX EXAM + -
1) "D"
2) "E"
3) "A"
4) "I"
5) "F"
127.0.0.1:6379> ZREVRANK EXAM d
(nil)
127.0.0.1:6379> ZREVRANK EXAM D
(integer) 0
127.0.0.1:6379> ZREVRANK EXAM C
(nil)
127.0.0.1:6379> 

18、ZSCORE 命令


用于返回成员MEMBER的分值。

如果在有序集合中不存在,则返回nil。

127.0.0.1:6379> ZSCORE KEY MEMBER 

例如,

127.0.0.1:6379> ZREVRANGE EXAM 0 -1 WITHSCORES
 1) "D"
 2) "30000"
 3) "E"
 4) "40"
 5) "A"
 6) "10"
 7) "I"
 8) "8"
 9) "F"
10) "5"
127.0.0.1:6379> ZSCORE EXAM D
"30000"
127.0.0.1:6379> ZSCORE EXAM C
(nil)

19、ZUNIONSTORE 命令


用于对给定的有序集合执行并集运算,运算结果集存储到DESTINATION中。

其中,有序集合通过KEY指定;有序集合的数量通过NUMKEY指定。

WEIGHTS选项,用于指定一个乘法因子,有序集合中每个成员的SCORE值乘以该因子后,结果传递给聚合函数。并且,乘法因子的设置需要根据有序集合的个数分别指定。默认为1。

AGGREGATE选项,用于指定该交集的结果集的聚合方式。默认使用的是SUM。

阿萨德

127.0.0.1:6379> ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

例如,

127.0.0.1:6379> ZADD FINA_EXAM 91 A 80 B 63 C 70 D
(integer) 4
127.0.0.1:6379> ZADD MIDD_EXAM 80 A 76 B 59 C
(integer) 3
127.0.0.1:6379> ZUNIONSTORE SUM 2 MIDD_EXAM FINA_EXAM
(integer) 4
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
1) "D"
2) "70"
3) "C"
4) "122"
5) "B"
6) "156"
7) "A"
8) "171"
127.0.0.1:6379> ZUNIONSTORE SUM 2 MIDD_EXAM FINA_EXAM WEIGHTS 1 1 AGGREGATE SUM
(integer) 4
127.0.0.1:6379> ZRANGE SUM 0 -1 WITHSCORES
1) "D"
2) "70"
3) "C"
4) "122"
5) "B"
6) "156"
7) "A"
8) "171"

20、ZSCAN 命令


用于迭代有序集合中的元素,包括元素成员与元素分值。

注:有待继续研究!

127.0.0.1:6379> ZSCAN KEY CURSOR [MATCH pattern] [COUNT count]

例如,

127.0.0.1:6379> ZSCAN SUM 0
1) "0"
2) 1) "C"
   2) "122"
   3) "B"
   4) "156"
   5) "A"
   6) "171"
127.0.0.1:6379> ZSCAN SUM 0 MATCH A
1) "0"
2) 1) "A"
   2) "171"
127.0.0.1:6379> ZSCAN SUM 0 MATCH A COUNT 1
1) "0"
2) 1) "A"
   2) "171"

 

posted @ 2017-05-19 00:14  大尾巴狼R  阅读(3950)  评论(0编辑  收藏  举报