有序集合类型(sorted set)特点在于“有序”二字。它在集合类型的基础上为集合中的每一个元素都关联了一个分数,这不仅可以用来完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同。



有序集合类型与列表类型的对比


# 相似点:


1). 二者都是有序的。


2). 二者都可以获得某一范围的元素。


# 异同点:


1). 列表类型是通过链表实现的,获得靠近两端的元素速度极快,当元素增多后,访问中间数据的速度回较慢。


2). 有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度O(logN))。


3). 列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改元素的分数)。


4). 有序集合类型比列表类型更耗内存。



// 命令


1. 增加元素


[root@localhost ~]# docker exec -it redis1 redis-cli
127.0.0.1:6379> zadd scoreboard 89 Tom 67 Peter 100 David
(integer) 3
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  # +inf 正无穷
(integer) 1
127.0.0.1:6379> zadd testboard -inf d  # -inf 负无穷
(integer) 1

2. 获得元素的分数


127.0.0.1:6379> zscore scoreboard Tom
"89"

3. 获得排名在某个范围的元素列表


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"
127.0.0.1:6379> zrange scoreboard 0 -1
1) "Peter"
2) "Tom"
3) "David"
127.0.0.1:6379> zrange scoreboard 0 -1 withscores  # 带上分数
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "David"
6) "100"
127.0.0.1:6379> zrange testboard 0 2 withscores
1) "d"
2) "-inf"
3) "b"
4) "1.5"
5) "a"
6) "1.6999999999999999e+308"

4. 获得指定分数范围的元素

127.0.0.1:6379> zrangebyscore scoreboard 80 100
1) "Tom"
2) "David"

# 不包含端点值,可以在分数前加上“(”符号,例如:80~100,可以包含80,不可以包含100

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"

# 获得分数高于60分的从第二个人开始的3笔数据


127.0.0.1:6379> zrangebyscore scoreboard 60 +inf limit 1 3  
1) "Peter"
2) "Tom"
3) "Wendy"
127.0.0.1:6379> zrangebyscore scoreboard 60 +inf withscores limit 1 3
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "Wendy"
6) "92"

# 获取分数低于或等于100的前3笔数据 

127.0.0.1:6379> zrevrangebyscore scoreboard 100 0 limit 0 3
1) "David"
2) "Wendy"
3) "Tom"
127.0.0.1:6379> zrevrangebyscore scoreboard 100 0 limit 0 3 withscores
1) "David"
2) "100"
3) "Wendy"
4) "92"
5) "Tom"
6) "89"

5. 增加某个元素的分数


127.0.0.1:6379> zscore scoreboard Jerry
"56"
127.0.0.1:6379> zincrby scoreboard 4 Jerry
"60"
127.0.0.1:6379> zincrby scoreboard -4 Jerry
"56"

6. 获得集合中元素的数量


127.0.0.1:6379> zcard scoreboard
(integer) 6

7. 获得指定分数范围内的元素个数


127.0.0.1:6379> zcount scoreboard 90 100
(integer) 2
127.0.0.1:6379> zcount scoreboard (89 +inf
(integer) 2

8. 删除一个或多个元素


127.0.0.1:6379> zrem scoreboard Wendy
(integer) 1
127.0.0.1:6379> zcard scoreboard
(integer) 5

9. 按照排名范围删除元素


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> zrange testRem 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
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. 按照分数范围删除元素


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. 获得元素的排名


127.0.0.1:6379> zrange scoreboard 0 -1
1) "Batman"
2) "Jerry"
3) "Yvonne"
4) "Peter"
5) "Tom"
6) "David"
127.0.0.1:6379> zrank scoreboard Peter
(integer) 3
127.0.0.1:6379> zrevrank scoreboard Peter
(integer) 2