Redis有序集合(Zset)
简介
Redis 有序集合(ZSet)是一种有序的数据结构,它类似于集合(Set),但每个成员都有一个关联的分数(score),这个分数用于对集合中的成员进行排序。有序集合中的成员是唯一的,但分数可以重复。有序集合非常适合用于需要按某个数值排序的场景,例如排行榜、时间线等。
基本特性
成员唯一性:有序集合中的每个成员都是唯一的,不会出现重复的成员。
有序性:成员按照其关联的分数进行排序。如果多个成员的分数相同,则按成员的字典序排序。
成员类型:成员必须是字符串类型,分数必须是浮点数。
常用命令
1. 添加成员
- ZADD key [NX | XX] [CH] [INCR] score member [score member ...]
- 将一个或多个成员及其分数添加到有序集合中。
NX
:只有当成员不存在时才添加。XX
:只有当成员已经存在时才更新分数。CH
:仅在成员的分数发生变化时返回受影响的成员数量。INCR
:将成员的分数增加指定的值,并返回新的分数。- 返回值:被成功添加或更新的成员数量。
示例:
ZADD myzset 1 "one"
ZADD myzset 2 "two"
ZADD myzset 3 "three"
2. 移除成员
- ZREM key member [member ...]
- 移除有序集合中的一个或多个成员。
- 返回值:被成功移除的成员数量。
示例:
ZREM myzset "two"
3. 获取成员的分数
- ZSCORE key member
- 返回有序集合中成员的分数。
- 返回值:成员的分数,如果成员不存在则返回
nil
。
示例:
ZSCORE myzset "one"
4. 获取成员的排名
- ZRANK key member
- 返回有序集合中成员的排名,排名从 0 开始。
- 返回值:成员的排名,如果成员不存在则返回
nil
。
示例:
ZRANK myzset "one"
- ZREVRANK key member
- 返回有序集合中成员的逆向排名,排名从 0 开始。
- 返回值:成员的逆向排名,如果成员不存在则返回
nil
。
示例:
ZREVRANK myzset "one"
5. 获取指定范围的成员
- ZRANGE key start stop [WITHSCORES]
- 返回有序集合中指定范围的成员,按分数从小到大排序。
WITHSCORES
:返回成员及其分数。- 返回值:指定范围内的成员。
示例:
ZRANGE myzset 0 -1 WITHSCORES
- ZREVRANGE key start stop [WITHSCORES]
- 返回有序集合中指定范围的成员,按分数从大到小排序。
WITHSCORES
:返回成员及其分数。- 返回值:指定范围内的成员。
示例:
ZREVRANGE myzset 0 -1 WITHSCORES
6. 获取指定分数范围的成员
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 返回有序集合中分数在指定范围内的成员,按分数从小到大排序。
WITHSCORES
:返回成员及其分数。LIMIT offset count
:返回从offset
开始的count
个成员。- 返回值:指定分数范围内的成员。
示例:
ZRANGEBYSCORE myzset 1 3 WITHSCORES
- ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- 返回有序集合中分数在指定范围内的成员,按分数从大到小排序。
WITHSCORES
:返回成员及其分数。LIMIT offset count
:返回从offset
开始的count
个成员。- 返回值:指定分数范围内的成员。
示例:
ZREVRANGEBYSCORE myzset 3 1 WITHSCORES
7. 计算有序集合的成员数量
- ZCARD key
- 返回有序集合中的成员数量。
- 返回值:有序集合中的成员数量。
示例:
ZCARD myzset
8. 计算指定分数范围内的成员数量
- ZCOUNT key min max
- 返回有序集合中分数在指定范围内的成员数量。
- 返回值:指定分数范围内的成员数量。
示例:
ZCOUNT myzset 1 3
9. 增加成员的分数
- ZINCRBY key increment member
- 将有序集合中成员的分数增加指定的值。
- 返回值:成员的新分数。
示例:
ZINCRBY myzset 1 "one"
10. 计算多个有序集合的交集、并集、差集
- ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]
- 计算多个有序集合的交集,并将结果保存到新的有序集合中。
WEIGHTS
:为每个有序集合指定权重,最终分数是成员的分数乘以其对应的权重。AGGREGATE
:指定如何聚合多个有序集合中的分数,默认为SUM
,也可以是MIN
或MAX
。- 返回值:结果有序集合中的成员数量。
示例:
ZINTERSTORE result 2 myzset1 myzset2 WEIGHTS 2 3 AGGREGATE SUM
- ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM | MIN | MAX]
- 计算多个有序集合的并集,并将结果保存到新的有序集合中。
WEIGHTS
:为每个有序集合指定权重,最终分数是成员的分数乘以其对应的权重。AGGREGATE
:指定如何聚合多个有序集合中的分数,默认为SUM
,也可以是MIN
或MAX
。- 返回值:结果有序集合中的成员数量。
示例:
ZUNIONSTORE result 2 myzset1 myzset2 WEIGHTS 2 3 AGGREGATE SUM
- ZDIFFSTORE destination numkeys key [key ...]
- 计算第一个有序集合与其他有序集合的差集,并将结果保存到新的有序集合中。
- 返回值:结果有序集合中的成员数量。
示例:
ZDIFFSTORE result 2 myzset1 myzset2
综合示例
假设我们有两个有序集合 zset1
和 zset2
,分别包含以下成员和分数:
ZADD zset1 1 "one"
ZADD zset1 2 "two"
ZADD zset1 3 "three"
ZADD zset2 2 "two"
ZADD zset2 3 "three"
ZADD zset2 4 "four"
- 获取
zset1
的所有成员及其分数:
ZRANGE zset1 0 -1 WITHSCORES
输出:
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
- 计算
zset1
和zset2
的交集:
ZINTERSTORE result 2 zset1 zset2
ZRANGE result 0 -1 WITHSCORES
输出:
1) "two"
2) "4"
3) "three"
4) "6"
- 计算
zset1
和zset2
的并集:
ZUNIONSTORE result 2 zset1 zset2
ZRANGE result 0 -1 WITHSCORES
输出:
1) "one"
2) "1"
3) "two"
4) "4"
5) "three"
6) "6"
7) "four"
8) "4"
- 计算
zset1
和zset2
的差集:
ZDIFFSTORE result 2 zset1 zset2
ZRANGE result 0 -1 WITHSCORES
输出:
1) "one"
2) "1"
应用场景
根据商品销售情况对商品进行排序,定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
商品编号1001的销量是9,商品编号1002的销量是15
|
zadd goods:sellsort 9 1001 15 1002
|
有一个客户又买了2件商品1001,商品编号1001销量加2
|
zincrby goods:sellsort 2 1001
|
求商品销量前10名
|
ZRANGE goods:sellsort 0 9 withscores
|