Redis 有序集合(Sorted Set)

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 有序集合命令

下面列出了 Redis 有序集合的基本命令。

ZADD命令

向有序集合添加一个或多个成员,或者更新已存在成员的分数,语法:

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命令

获取有序集合的成员数,语法:

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命令

计算在有序集合中指定区间分数的成员数,语法:

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

ZINCRBY命令

有序集合中对指定成员的分数加上增量 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"

ZINTERSTORE命令

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 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命令

在有序集合中计算指定字典区间内成员数量,语法:

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命令

通过索引区间返回有序集合指定区间内的成员,语法:

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命令

通过字典区间返回有序集合的成员,语法:

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命令

通过分数返回有序集合指定区间内的成员,语法:

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命令

返回有序集合中指定成员的索引,语法:

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命令

移除有序集合中的一个或多个成员,语法:

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命令

移除有序集合中给定的字典区间的所有成员,语法:

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命令

移除有序集合中给定的排名区间的所有成员,语法:

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命令

移除有序集合中给定的分数区间的所有成员,语法:

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命令

返回有序集中指定区间内的成员,通过索引,分数从高到低,语法:

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命令

返回有序集中指定分数区间内的成员,分数从高到低排序,语法:

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命令

返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序,语法:

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命令

返回有序集中,成员的分数值,语法:

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"

ZUNIONSTORE命令

计算给定的一个或多个有序集的并集,并存储在新的 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命令

迭代有序集合中的元素(包括元素成员和元素分值),语法:

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 进行参考。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号