初始模型:
店铺维度维护一个销量排行榜,商品 ID 作为 member,销量作为 score。销量变化时实时更新 ZSet,查询时直接取 Top50。
- ZSet 排行:需要实时维护有序销量榜 → 一个店铺一个 ZSet,用
ZINCRBY更新销量,用ZREVRANGE取 Top50 - 原子更新:高并发下销量不能加错 → 直接使用 Redis 的原子增减操作
- 准确性:重复消息、退款、取消可能让统计偏差 → 消费幂等,必要时反向扣减,定期对账兜底
- 时间窗口:如果不是累计榜,而是日榜/小时榜 → 按天、小时拆不同的 ZSet Key
- 热 Key / 大 Key:热门店铺商品多、更新频繁时单个 ZSet 可能压力大 → 必要时按商品分片,维护局部 TopN,再合并成全局 Top50
- 数据恢复:Redis 排行榜更适合作为派生数据 → 异常丢失时可以从订单/销量明细重新构建
最后主线就是:
ZSet 实时累加 → 直接取 Top50 → 幂等和对账保准确 → 时间榜按窗口拆 Key → 极端热点再做分片。