← 每日面试题 学习看板

如何实现百万级排行榜功能?

面试题/01实践场景题/实践场景题目/缓存与Redis应用/如何实现百万级排行榜功能?.md

面试记录 2026-10-15

题目:如何实现百万级排行榜功能?

难度:high

评分:⭐⭐⭐⭐☆☆(3/5)

我的回答

百万级数据的排行榜也不会查看全部百万的数据,在缓存中只会加载 topN 前置查看 topN 可以直接在 redis 中通过 zset 去实现,按照对应分数设定排序,超出预期的内容,如果有查看的,可以基于数据库去对分页内容进行查询,这部分业务逻辑实现的话就去基于数据库做就好了,查看频率会比较低,可以在排行榜处增加查看更多,点击后查看,然后跳转到独立页面进行单独实现,这堆查看并发量就没那么高了

点评

优点:

Top N 缓存 + DB 分页思路抓到- 查看更多跳转独立页面方案对

不足:

❌ 遗漏 Top N 大小如何确定- ❌ 遗漏排行榜实时性(Lua 原子更新/消息队列异步)- ❌ 遗漏分维度排行榜(实时/小时/日/周榜)- ❌ 遗漏排行榜降级方案- ❌ 遗漏排行榜防作弊- ❌ 遗漏并发更新性能优化- ❌ 遗漏 ZREVRANK 获取排名 O(log N)

完整讲解

第一部分:知识重点剖析

核心考点:考察大规模排行榜的架构设计能力,理解"缓存 + DB"分层策略。

知识点拆解:

  1. 核心思路:缓存只存 Top N,其余走 DB 分页
  2. Top N 大小确定:
  1. 架构分层:
  1. 排行榜实时性:
  1. 分维度排行榜:
  1. 排行榜降级:
  1. 防作弊:

关键性能指标:

第二部分:考察方向与延伸递进

  1. Top N 大小如何确定?
  1. 排行榜如何保证实时性?
  1. 排行榜如何防作弊?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,百万级排行榜的核心思路是缓存只存 Top N,其余走 DB 分页。

Top N 大小根据业务需求和性能确定,一般 Top 1000 覆盖 99% 展示需求。ZREVRANGE 0 999 在百万级 Zset 上 O(log n + 1000),毫秒级响应。

架构分层:Redis Zset 存 Top 1000,实时查询;MySQL 存全量数据,分页查询。Top N 外用户点击"查看更多"跳转独立页面,DB 分页查询。

排行榜实时性:Lua 原子更新(ZADD + ZREVRANGE 原子执行,避免并发不一致)、MQ 异步更新(业务事件发 MQ,消费者更新 Zset,削峰解耦)、定时刷新(兜底)。

分维度排行榜:实时榜、小时榜、日榜、周榜用多个独立 Zset,每个维度独立过期时间。

降级方案:缓存宕机降级到只读 DB(限流),DB 宕机只展示 Redis 缓存数据,MQ 积压降级为定时刷新。

防作弊:异常分数检测(突增告警)、频率限制(单用户更新频率)、黑名单机制。

性能指标:Top 1000 查询 O(log n + 1000) 毫秒级,更新分数 O(log n) 毫秒级,获取排名 O(log n) 毫秒级。