Zset(有序集合)是Redis中一种特殊的数据结构,它与Set不同之处在于每个成员都关联了一个分数(score),可以按照分数进行排序。Zset的成员是唯一的,但分数可以重复。

1. 添加元素

  • zadd key score member [score member ...]
    • 添加一个或多个元素到有序集合中
    • 如果元素已存在,会更新其分数并重新排序
    • 示例:zadd myset 1 "user1" 2 "user2"

2. 获取集合长度

  • zcard key
    • 获取有序集合的成员数量
    • 示例:zcard myset

3. 查看指定范围的成员

  • zrange key start stop [WITHSCORES]
    • 按分数从小到大返回指定范围的成员
    • WITHSCORES选项可同时返回成员分数
    • 示例:zrange myset 0 2 WITHSCORES

4. 获取成员排名

  • zrank key member
    • 获取成员在有序集合中的排名(从0开始)
    • 示例:zrank myset "user2"

5. 获取指定分数范围的成员数量

  • zcount key min max
    • 获取分数在[min, max]范围内的成员数量
    • 示例:zcount myset 2 4

6. 删除成员

  • zrem key member [member ...]
    • 删除一个或多个成员
    • 示例:zrem myset "user1"

7. 获取成员分数

  • zscore key member
    • 获取指定成员的分数
    • 示例:zscore myset "user2"

8. 修改成员分数

  • zincrby key increment member
    • 为指定成员的分数增加指定值(负值为减少)
    • 示例:zincrby myset 1 "user2"

9. 按分数范围获取成员

  • zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
    • 按分数范围获取成员
    • 示例:zrangebyscore myset 2 4 WITHSCORES

10. 倒序获取成员

  • zrevrange key start stop [WITHSCORES]
    • 从高分到低分返回指定范围的成员
    • 示例:zrevrange myset 0 2 WITHSCORES

11. 按分数范围倒序获取成员

  • zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
    • 从高分到低分按分数范围获取成员
    • 示例:zrevrangebyscore myset 4 2 WITHSCORES

12. 按分数范围删除成员

  • zremrangebyscore key min max
    • 删除分数在[min, max]范围内的所有成员
    • 示例:zremrangebyscore myset 1 2

13. 按排名范围删除成员

  • zremrangebyrank key start stop
    • 删除指定排名范围内的成员
    • 示例:zremrangebyrank myset 0 2

14. 获取最小分数的成员

  • zpopmin key [count]
    • 移除并返回有序集合中分数最小的count个成员
    • 示例:zpopmin myset 3

15. 获取最大分数的成员

  • zpopmax key [count]
    • 移除并返回有序集合中分数最大的count个成员
    • 示例:zpopmax myset 1

Zset底层实现

当有序集合中包含的元素数量超过server.zset_max_ziplist_entries(默认128)或元素的member长度超过server.zset_max_ziplist_value(默认64)时,Redis会使用跳跃表(Skiplist)作为底层实现;否则使用ziplist(在Redis 7中,ziplist被替换为listpack)。

Zset的有序性使得它非常适合用于排行榜、优先级队列等场景。