Redis 有序集合(Sorted Set)和集合(Set)一样,也是 string 类型元素的集合,并且集合元素不允许重复。
Redis 有序集合中每个元素都会关联一个 double 类型的分数(注意:分数允许重复),Redis 有序集合将按分数(score)进行排序。当多个元素具有相同的分数时,元素将按字典顺序排序。排序集的一些用例包括:
(1)排行榜。例如:您可以使用排序集轻松维护大型在线游戏中最高分的有序列表。
(2)速率限制器。特别是,您可以使用排序集来构建滑动窗口速率限制器,以防止过多的 API 请求。
注意:有序集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。有序集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40 多亿个成员)。
(1)随着玩家分数的变化,更新实时排行榜。例如:
127.0.0.1:6379> zadd leaderboard:455 100 user:1
(integer) 1
127.0.0.1:6379> ZADD leaderboard:455 75 user:2
(integer) 1
127.0.0.1:6379> ZADD leaderboard:455 101 user:3
(integer) 1
127.0.0.1:6379> ZADD leaderboard:455 15 user:4
(integer) 1
127.0.0.1:6379> ZADD leaderboard:455 275 user:2
(integer) 0注意:在最后的 ZADD 调用中,user:2 的分数被更新了。
(2)获得前3名球员的得分,如下:
127.0.0.1:6379> ZREVRANGE leaderboard:455 0 2 WITHSCORES
1) "user:2"
2) "275"
3) "user:3"
4) "101"
5) "user:1"
6) "100"(3)用户2 的级别是多少?
127.0.0.1:6379> ZREVRANK leaderboard:455 user:2
(integer) 0注意:ZREVRANK 命令用来返回存储在 key 的排序集中成员的排名,分数从高到低排序。排名(或索引)从 0 开始,这意味着得分最高的成员的排名为 0。
下面列出了 Redis 有序集合的基本命令。
向有序集合添加一个或多个成员,或者更新已存在成员的分数,语法:
ZADD key score1 member1 [score2 member2]实例:
127.0.0.1:6379> zadd zset:key1 100 google
(integer) 1
127.0.0.1:6379> zadd zset:key1 200 baidu
(integer) 1获取有序集合的成员数,语法:
ZCARD key实例:
127.0.0.1:6379> zadd zset:key1 100 google
(integer) 1
127.0.0.1:6379> zadd zset:key1 200 baidu
(integer) 1
127.0.0.1:6379> zcard zset:key1
(integer) 2计算在有序集合中指定区间分数的成员数,语法:
ZCOUNT key min max实例:
127.0.0.1:6379> zadd zset:key1 100 google
(integer) 1
127.0.0.1:6379> zadd zset:key1 200 baidu
(integer) 1
127.0.0.1:6379> zadd zset:key1 300 bing
(integer) 1
127.0.0.1:6379> zadd zset:key1 400 yahoo
(integer) 1
127.0.0.1:6379> zcount zset:key1 200 300
(integer) 2有序集合中对指定成员的分数加上增量 increment,语法:
ZINCRBY key increment member实例:
127.0.0.1:6379> zadd zset:key1 100 google
(integer) 1
127.0.0.1:6379> zincrby zset:key1 20 google
"120"
127.0.0.1:6379> zscore zset:key1 google
"120"计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中,语法:
ZINTERSTORE destination numkeys key [key ...]实例:
127.0.0.1:6379> zadd zset:key1 100 google 200 baidu 300 bing
(integer) 3
127.0.0.1:6379> zadd zset:key2 100 google 300 bing 400 yahoo
(integer) 3
127.0.0.1:6379> zinterstore zset:result 2 zset:key1 zset:key2
(integer) 2
127.0.0.1:6379> zrange zset:result 0 -1 withscores
1) "google"
2) "200"
3) "bing"
4) "600"在有序集合中计算指定字典区间内成员数量,语法:
ZLEXCOUNT key min max实例:
127.0.0.1:6379> zadd zset:key 0 a 0 b 0 c 0 d
(integer) 4
127.0.0.1:6379> zlexcount zset:key [a [c
(integer) 3通过索引区间返回有序集合指定区间内的成员,语法:
ZRANGE key start stop [WITHSCORES]实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 300 bing
(integer) 3
127.0.0.1:6379> zrange zset:key 0 -1 WITHSCORES
1) "google"
2) "100"
3) "baidu"
4) "200"
5) "bing"
6) "300"通过字典区间返回有序集合的成员,语法:
ZRANGEBYLEX key min max [LIMIT offset count]实例:
127.0.0.1:6379> zadd zset:key 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrangebylex zset:key [a [d
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> zrangebylex zset:key [a [d limit 1 2
1) "b"
2) "c"通过分数返回有序集合指定区间内的成员,语法:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]实例:
127.0.0.1:6379> zadd zset:key 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrangebyscore zset:key 3 5
1) "c"
2) "d"
3) "e"
127.0.0.1:6379> zrangebyscore zset:key 3 5 withscores
1) "c"
2) "3"
3) "d"
4) "4"
5) "e"
6) "5"
127.0.0.1:6379> zrangebyscore zset:key 3 5 withscores limit 1 2
1) "d"
2) "4"
3) "e"
4) "5"返回有序集合中指定成员的索引,语法:
ZRANK key member实例:
127.0.0.1:6379> zadd zset:key 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrank zset:key c
(integer) 2
127.0.0.1:6379> zrank zset:key d
(integer) 3移除有序集合中的一个或多个成员,语法:
ZREM key member [member ...]实例:
127.0.0.1:6379> zadd zset:key 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrem zset:key c
(integer) 1
127.0.0.1:6379> zrem zset:key d
(integer) 1
127.0.0.1:6379> zrange zset:key 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "e"
6) "5"移除有序集合中给定的字典区间的所有成员,语法:
ZREMRANGEBYLEX key min max实例:
127.0.0.1:6379> zadd zset:key 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zremrangebylex zset:key [c [d
(integer) 2
127.0.0.1:6379> zrange zset:key 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "e"
6) "5"移除有序集合中给定的排名区间的所有成员,语法:
ZREMRANGEBYRANK key start stop实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zremrangebyrank zset:key 0 2
(integer) 3
127.0.0.1:6379> zrange zset:key 0 -1 withscores
1) "bing"
2) "400"移除有序集合中给定的分数区间的所有成员,语法:
ZREMRANGEBYSCORE key min max实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zremrangebyscore zset:key 200 300
(integer) 2
127.0.0.1:6379> zrange zset:key 0 -1 withscores
1) "google"
2) "100"
3) "bing"
4) "400"返回有序集中指定区间内的成员,通过索引,分数从高到低,语法:
ZREVRANGE key start stop [WITHSCORES]实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zrevrange zset:key 0 2 withscores
1) "bing"
2) "400"
3) "yahoo"
4) "300"
5) "baidu"
6) "200"返回有序集中指定分数区间内的成员,分数从高到低排序,语法:
ZREVRANGEBYSCORE key max min [WITHSCORES]实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zrevrangebyscore zset:key 300 200 withscores
1) "yahoo"
2) "300"
3) "baidu"
4) "200"
127.0.0.1:6379> zrevrangebyscore zset:key 300 200 withscores limit 0 1
1) "yahoo"
2) "300"返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序,语法:
ZREVRANK key member实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zrevrank zset:key google
(integer) 3
127.0.0.1:6379> zrevrank zset:key yahoo
(integer) 1返回有序集中,成员的分数值,语法:
ZSCORE key member实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zscore zset:key google
"100"
127.0.0.1:6379> zscore zset:key baidu
"200"计算给定的一个或多个有序集的并集,并存储在新的 key 中,语法:
ZUNIONSTORE destination numkeys key [key ...]实例:
127.0.0.1:6379> zadd zset:key1 100 google 200 baidu 300 bing
(integer) 3
127.0.0.1:6379> zadd zset:key2 200 baidu 300 bing 400 yahoo
(integer) 3
127.0.0.1:6379> zunionstore zset:result 2 zset:key1 zset:key2
(integer) 4
127.0.0.1:6379> zrange zset:result 0 -1 withscores
1) "google"
2) "100"
3) "baidu"
4) "400"
5) "yahoo"
6) "400"
7) "bing"
8) "600"迭代有序集合中的元素(包括元素成员和元素分值),语法:
ZSCAN key cursor [MATCH pattern] [COUNT count]实例:
127.0.0.1:6379> zadd zset:key 100 google 200 baidu 400 bing 300 yahoo
(integer) 4
127.0.0.1:6379> zscan zset:key 0 match *g
1) "0"
2) 1) "bing"
2) "400"
127.0.0.1:6379> zscan zset:key 0 match *g*
1) "0"
2) 1) "google"
2) "100"
3) "bing"
4) "400"更多命令请访问 https://redis.io/commands 进行参考。