Redis入门(六)

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

 综合示例

假设我们有两个有序集合 zset1zset2,分别包含以下成员和分数:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值