Sorted Set 与排行榜
约 609 字大约 2 分钟
布欧-Lewyon
2026-05-15
Sorted Set(ZSet)是带分数的有序集合,每个元素关联一个 double 类型的分数,按分数排序。
基础操作
# 添加成员(成员 : 分数)
ZADD leaderboard:2026 100 "Alice" 85 "Bob" 95 "Charlie"
# 按排名升序取全部
ZRANGE leaderboard:2026 0 -1 WITHSCORES
1) "Bob"
2) "85"
3) "Charlie"
4) "95"
5) "Alice"
6) "100"
# 按排名降序取前 3
ZREVRANGE leaderboard:2026 0 2 WITHSCORES
1) "Alice"
2) "100"
3) "Charlie"
4) "95"
5) "Bob"
6) "85"排名与分数
# 查看成员分数
ZSCORE leaderboard:2026 "Alice" # 100
# 查看排名(0 为最高)
ZRANK leaderboard:2026 "Alice" # 2(升序排名)
ZREVRANK leaderboard:2026 "Alice" # 0(降序排名)
# 增加分数
ZINCRBY leaderboard:2026 10 "Bob" # Bob 加 10 分
# 115
# 总数
ZCARD leaderboard:2026 # 3范围操作
# 按分数范围取成员
ZRANGEBYSCORE leaderboard:2026 90 100
1) "Charlie"
2) "Alice"
# 按分数范围删除
ZREMRANGEBYSCORE leaderboard:2026 0 80 # 删除 80 分以下
# 按排名删除
ZREMRANGEBYRANK leaderboard:2026 0 0 # 删除第一名
# 获取分数范围内的成员数
ZCOUNT leaderboard:2026 90 100 # 2应用场景
排行榜
# 日排行榜
ZINCRBY rank:daily:2026-05-15 1 "user:1"
ZINCRBY rank:daily:2026-05-15 1 "user:2"
ZINCRBY rank:daily:2026-05-15 3 "user:1"
# 取前 10
ZREVRANGE rank:daily:2026-05-15 0 9 WITHSCORES
# 取我的排名
ZREVRANK rank:daily:2026-05-15 "user:1"
# 周排行榜(合并多天)
ZUNIONSTORE rank:weekly 7
rank:daily:2026-05-09 rank:daily:2026-05-10 ...延迟队列
# 用分数作为时间戳,实现延迟任务
ZADD delay:queue 1700000000 "task:email:1"
ZADD delay:queue 1700000100 "task:cleanup:1"
# 轮询获取到期的任务
ZRANGEBYSCORE delay:queue 0 1700000050
# "task:email:1"
# 移除已处理的任务
ZREMRANGEBYSCORE delay:queue 0 1700000050自动补全
ZADD autocomplete 0 "apple" 0 "apply" 0 "application"
ZRANGEBYLEX autocomplete "app" "app\xff" LIMIT 0 5数据结构
# 小集合用 ziplist(有序 + 连续内存)
# 大集合用 skiplist + dict(O(logN) 操作)
# 默认 128 个以内用 ziplist
# zset-max-ziplist-entries 128
# zset-max-ziplist-value 64小结
| 命令 | 用途 | O |
|---|---|---|
ZADD | 添加 | logN |
ZRANGE | 升序遍历 | logN + M |
ZREVRANGE | 降序遍历 | logN + M |
ZRANK/ZREVRANK | 排名 | logN |
ZSCORE | 分数 | 1 |
ZINCRBY | 加分 | logN |
ZRANGEBYSCORE | 按分数范围取 | logN + M |
ZUNIONSTORE | 合并 | N + M |
- Sorted Set(ZSet)每个成员带分数,按分数排序。
- 排行榜核心:
ZINCRBY加分、ZREVRANGE取 TopN、ZUNIONSTORE合并。 - 延迟队列:分数存时间戳,轮询到期任务。
ZRANGEBYLEX实现自动补全。
上一节:Set 与标签系统 下一节:Hash 与对象缓存
