Redis ZSET

Redis ZSet 是实时榜单的常用数据结构。它同时保存成员和分数,并按分数排序,非常适合 TopN 查询。

ZADD hot:global 9823 topic_123
ZREVRANGE hot:global 0 49 WITHSCORES

本章主线

本章围绕三个问题展开:

  1. ZSet 结构:为什么它适合榜单。
  2. Score 设计:热度分如何映射到 ZSet 分数。
  3. 批量更新:事件流如何高效更新榜单。

Score 设计

Score 不一定是简单计数。它可以是:

score = 基础互动分 + 时间衰减 + 质量加权 - 风险惩罚

ZSet 只负责排序,热度公式仍然由业务计算。不要把所有业务逻辑都塞进 Redis 命令里。

时间窗口

榜单通常按窗口拆分:

  • 实时榜:最近 5 分钟或 1 小时。
  • 日榜:当天。
  • 周榜:本周。
  • 总榜:长期累计。

不同窗口使用不同 key,并设置过期时间。窗口结束后可以把结果落库,用于历史榜单和分析。

批量更新

高频事件不能每条都同步更新多个榜单。可以先聚合事件,再批量更新 ZSet:

互动事件 -> 聚合增量 -> ZINCRBY 批量更新 -> 定期刷新快照

这样能降低 Redis 写压力。下一章会进一步讨论热度公式本身如何设计。

章节