排行榜场景是什么
排行榜的标准实现是有序集合:ZINCRBY 累加分数做打点,ZREVRANGE 取 TopN,ZREVRANK 查某个成员的名次,ZSCORE 读当前分数。日榜、周榜、月榜各自建键,再用 ZUNIONSTORE 或定时任务合并汇总。名次从 0 开始,同分时按成员字典序排列,需要稳定顺序就得用复合分数。
基本信息
| 核心命令 | ZINCRBY / ZREVRANGE / ZREVRANK / ZSCORE / ZUNIONSTORE |
|---|---|
| 排名约定 | 0 为第一名;同分按成员字典序 |
| 分页 | ZREVRANGE start stop 或 ZRANGE 加 REV |
| 并列控制 | 用复合分数(分数加时间戳小数位)固定顺序 |
| 成本 | 单条读写与查询名次均为 O(logN) |
典型使用场景
- 日榜周榜月榜:各自建键,定时任务滚动合并
- 实时积分榜:ZINCRBY 打点后立刻刷新 TopN
- 我的排名:ZREVRANK 加 ZSCORE 组合展示
- 奖励结算:按排名取前 N 名并核对分数,避免漏发
- 多场次汇总:ZUNIONSTORE 把多个榜单按分数合并
- 去重计分:同一成员只保留一个分数,天然避免重复上榜
完整流程
完整流程
ZINCRBY rank:daily 1 user:88 # 打点,返回累加后的分数
ZINCRBY rank:daily 10 user:99 # 加不同权重
ZREVRANGE rank:daily 0 9 WITHSCORES # 取 Top10 带分数
ZREVRANK rank:daily user:88 # 我的名次,0 基
ZSCORE rank:daily user:88 # 我的分数
ZCARD rank:daily # 参与人数
ZREMRANGEBYRANK rank:daily 1000 -1 # 只保留前 1000 名,控制内存
ZUNIONSTORE rank:week 7 rank:day:1 rank:day:2 AGGREGATE SUM # 周榜合并
EXPIRE rank:day:1 604800 # 明细榜保留一周便于复盘命令对照
| 命令 | 作用 | 注意点 |
|---|---|---|
| ZINCRBY | 累加成员分数 | 分数可用浮点,累计过多会有精度误差 |
| ZREVRANGE | 取 TopN 或分页 | 全量取 0 -1 在大榜单上开销大 |
| ZREVRANK | 查成员名次 | 成员不存在返回 nil |
| ZSCORE | 读当前分数 | 与 ZREVRANK 一起用可做排名卡片 |
| ZUNIONSTORE | 多榜合并 | 需要指定聚合方式,默认求和 |
面向 UI 的「我的排名」在大榜单上也是 O(logN),可以放心用;但 TopN 与周围名次一起展示时需要两次查询,注意合并结果。
周期榜要规划过期与清理:日榜可保留一周便于复盘,周榜合并完成后即可清理明细键,否则历史榜单会持续占用内存。