【Redis实战】有序集合类型(Sorted Set)

2022-05-12 08:54:51 浏览数 (1)

文章目录
  • 1、增加元素(ZADD)
  • 2、获得元素的分数(ZSCORE)
  • 3、获得排名在某个范围的元素列表(ZRANGE)
  • 4、获得指定分数范围的元素(ZRANGEBYSCORE)
  • 5、增加某个元素的分数(ZINCRBY)
  • 6、获得集合中元素的数量(ZCARD)
  • 7、获得指定分数范围内的元素个数(ZCOUNT)
  • 8、删除一个或多个元素(ZREM)
  • 9、按照排名范围删除元素(ZREMRANGEBYRANK)
  • 10、按照分数范围删除元素(ZREMRANGEBYSCORE)
  • 11、获得元素的排名(ZRANK)

1、增加元素(ZADD)

  ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD命令的返回值是新加入到集合中的元素个数(不包含之前已经存在的元素)。   假设我们用有序集合模拟计分板,现在要记录Tom、Peter和David三名运动员的分数(分别是89分、67分和100分):

代码语言:javascript复制
127.0.0.1:6379> ZADD scoreboard 89 Tom 67 Peter 100 David
(integer) 3

  这时,我们发现Peter的分数录入有误,实际的分数应该是76分,可以用ZADD命令修改Peter的分数:

代码语言:javascript复制
127.0.0.1:6379> ZADD scoreboard 76 Peter
(integer) 0

  分数不仅可以是整数,还支持双精度浮点数:

代码语言:javascript复制
127.0.0.1:6379> ZADD testboard 17E 307 a
(integer) 1
127.0.0.1:6379> ZADD testboard 1.5 b
(integer) 1
127.0.0.1:6379> ZADD testboard  inf c
(integer) 1
127.0.0.1:6379> ZADD testboard -inf d
(integer) 1

2、获得元素的分数(ZSCORE)

代码语言:javascript复制
127.0.0.1:6379> ZSCORE scoreboard Tom
"89"

3、获得排名在某个范围的元素列表(ZRANGE)

  ZRANGE命令会按照元素分数从小从大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。ZRANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。

代码语言:javascript复制
127.0.0.1:6379> ZRANGE scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
127.0.0.1:6379> ZRANGE scoreboard 1 -1
1) "Tom"
2) "David"

  如果需要同时获得元素的分数的话可以在ZRANGE命令的尾数加上WITHSCORES参数,这时返回的数据格式就从“元素1,元素2,…,元素n”变为了“元素1,分数1,元素2,分数2,…,元素n,分数n”。

代码语言:javascript复制
127.0.0.1:6379> ZRANGE scoreboard 0 -1 WITHSCORES
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "David"
6) "100"

4、获得指定分数范围的元素(ZRANGEBYSCORE)

  ZRANGEBYSCORE命令参数虽然多,但是都很好理解。该命令按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素。

代码语言:javascript复制
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 100
1) "Tom"
2) "David"

  如果希望分数范围不包含断点值,可以在分数前加上“(”符号。例如,希望返回80分到100分的数据,可以含80分,但不包含100分,则稍微修改一下上面的命令即可:

代码语言:javascript复制
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 (100
1) "Tom"

  min和max还支持无穷大,同ZADD命令一样,-inf和 inf分别表示负无穷和正无穷。比如你希望得到所有分数高于80分(不包含80分)的人的名单,但你却不知道最高分是多少,这是就可以用上 inf了。

代码语言:javascript复制
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80  inf
1) "Tom"
2) "David"

  想获得分数高于60分的从第二个人开始的3个人。

代码语言:javascript复制
127.0.0.1:6379> ZADD scoreboard 56 Jerry 92 Wendy 67 Yvonne
(integer) 3
127.0.0.1:6379> ZRANGE scoreboard 0 -1 WITHSCORES
 1) "Jerry"
 2) "56"
 3) "Yvonne"
 4) "67"
 5) "Peter"
 6) "76"
 7) "Tom"
 8) "89"
 9) "Wendy"
10) "92"
11) "David"
12) "100"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 60  inf LIMIT 1 3
1) "Peter"
2) "Tom"
3) "Wendy"

  获得分数低于或等于100分的前3个人。

代码语言:javascript复制
127.0.0.1:6379> ZREVRANGEBYSCORE scoreboard 100 0 LIMIT 0 3
1) "David"
2) "Wendy"
3) "Tom"

5、增加某个元素的分数(ZINCRBY)

  ZINCRBY命令可以增加一个元素的分数,返回值是更改后的分数。例如,想给Jerry加4分:

代码语言:javascript复制
127.0.0.1:6379> ZINCRBY scoreboard 4 Jerry
"60"
127.0.0.1:6379> ZINCRBY scoreboard -4 Jerry
"56"

6、获得集合中元素的数量(ZCARD)

代码语言:javascript复制
127.0.0.1:6379> ZCARD scoreboard
(integer) 6

7、获得指定分数范围内的元素个数(ZCOUNT)

代码语言:javascript复制
127.0.0.1:6379> ZCOUNT scoreboard 90 100
(integer) 2
127.0.0.1:6379> ZCOUNT scoreboard (89  inf
(integer) 2

8、删除一个或多个元素(ZREM)

代码语言:javascript复制
127.0.0.1:6379> ZREM scoreboard Wendy
(integer) 1
127.0.0.1:6379> ZCARD scoreboard
(integer) 5

9、按照排名范围删除元素(ZREMRANGEBYRANK)

  ZREMRANGEBYRANK命令按照元素分数从小到大的顺序(即索引0表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素数量,如:

代码语言:javascript复制
127.0.0.1:6379> ZADD testRem 1 a 2 b 3 c 4 d 5 e 6 f
(integer) 6
127.0.0.1:6379> ZREMRANGEBYRANK testRem 0 2
(integer) 3
127.0.0.1:6379> ZRANGE testRem 0 -1
1) "d"
2) "e"
3) "f"

10、按照分数范围删除元素(ZREMRANGEBYSCORE)

  ZREMRANGEBYSCORE命令来删除指定分数范围内的所有元素,参数min和max的特征和ZRANGEBYSCORE命令中的一样。返回值是删除的元素数量。

代码语言:javascript复制
127.0.0.1:6379> ZREMRANGEBYSCORE testRem (4 5
(integer) 1
127.0.0.1:6379> ZRANGE testRem 0 -1
1) "d"
2) "f"

11、获得元素的排名(ZRANK)

  ZRANK命令会按照元素分数从小到大的顺序获得指定的元素的排名(从0开始,即分数最小的元素排名为0)。ZRAVRANK命令则相反。

代码语言:javascript复制
127.0.0.1:6379> ZRANGE scoreboard 0 -1
1) "Jerry"
2) "Yvonne"
3) "Peter"
4) "Tom"
5) "David"
127.0.0.1:6379> ZRANK scoreboard Peter
(integer) 2
127.0.0.1:6379> ZREVRANK scoreboard Peter
(integer) 2

0 人点赞