千万级用户排行榜整体设计方案

103 阅读6分钟

千万级用户排行榜整体设计方案

适配千万级海量用户高并发读写、实时刷新、榜单公平防作弊、多维度榜单、海量数据分页查询,分为业务规则设计、架构分层设计、数据库存储设计、排序算法、缓存方案、防刷机制、前端展示、扩容优化8个模块。

一、基础业务规则设计(定榜单底层逻辑)

1. 榜单分类

  1. 实时榜单:小时榜、实时战力榜、在线榜单,秒级更新;
  2. 周期榜单:日榜、周榜、月榜、赛季榜,周期结算归档;
  3. 分类榜单:总榜、地区榜、赛道榜、新人榜、氪金榜、活跃度榜;
  4. 个性化榜单:好友排行榜、同城排行榜、关注榜单。

2. 排名规则

  • 主排序:核心分值(活跃度、积分、贡献值、战力)降序;
  • 次要排序:分值相同时,优先对比首次达到该分值时间,越早排名越高;
  • 名次定义:1/2/3名为TOP3,后续统一为第N名,不并列同名次。

3. 榜单时效与重置

  • 短时榜单:整点/零点自动清零重新统计;
  • 长周期榜单:结束后归档历史榜单,生成历史榜单快照,支持回溯查看往期排名。

二、整体技术架构(千万级高并发核心)

采用前端→网关→应用服务→多级缓存→持久化数据库分层架构,读写分离,热点数据全缓存。

  1. 接入层:网关限流、防恶意刷榜请求拦截,削峰;
  2. 业务服务层
    • 积分统计服务:异步统计用户行为,计算分值,禁止同步计算排行榜;
    • 榜单计算服务:定时+增量刷新榜单,不全局全量重排;
    • 查询服务:专门承接榜单查看、分页、个人排名查询;
  3. 缓存层(核心):Redis集群承担99%榜单查询,持久层仅落地归档数据;
  4. 持久层:MySQL+分库分表,仅存储用户基础数据、历史榜单、结算日志。

三、Redis排行榜核心存储方案(千万用户首选)

1. 核心结构:ZSet 有序集合

  • Key设计:rank:榜单类型:周期,示例:rank:total:week 周总榜
  • Score:榜单分值;Member:唯一用户ID
  • 天然支持:自动排序、查询指定区间排名、查询个人名次、TOPN快速截取。

2. 海量用户优化(千万级全量ZSet缺陷优化)

千万用户全部放入单个ZSet会内存占用高、排序卡顿,拆分方案:

方案A:分片ZSet(推荐)

按用户ID哈希分片,分为16/32个分片ZSet,每次更新仅操作对应分片; 查询全局TOP100:多分片并行取前100,汇总二次排序; 查询个人排名:定位分片查询。

方案B:冷热分离
  • 热榜:前10万名存入ZSet实时排序;
  • 长尾普通用户:不实时参与全局排序,只记录分值,用户主动查询名次时临时定位排名; 绝大多数用户只会查看TOP榜单、自己名次,不会翻几百页长尾榜单,大幅节省内存。

3. 辅助缓存

  1. 热点TOP榜单:TOP10、TOP50、TOP100缓存为String/List,前端直取,无需遍历ZSet;
  2. 个人名次缓存:user:rank:类型:uid,缓存个人实时名次,过期自动刷新;
  3. 周期快照缓存:榜单结束后,将完整榜单快照存入Hash永久缓存。

4. 更新策略(拒绝高频全量重排)

  • 增量更新:用户行为加分/扣分,仅ZINCRBY单条修改分值,Redis自动维护排序;
  • 批量合并:高并发场景,使用队列攒50~200条积分变更,批量写入Redis,降低IO。

四、数据库持久化设计

1. 数据表拆分

  1. 用户基础积分表 uid、总积分、日积分、周积分、上次更新时间、标签,按uid分库分表;
  2. 榜单归档表 榜单类型、周期、uid、名次、积分、上榜时间,用于历史榜单查询、对账;
  3. 行为日志表 记录加分来源,用于作弊溯源、数据复盘。

2. 读写规范

  • 读:榜单查询绝不查MySQL,全部走Redis;
  • 写:实时积分变更只写Redis,定时任务(5~30分钟)异步落地MySQL做备份;
  • 结算:榜单周期结束,一次性把榜单数据落库归档。

五、排序与查询设计

1. 常用查询场景实现

  1. 查TOPN榜单:ZREVRANGE key 0 N-1,毫秒返回;
  2. 查个人排名:ZREVRANK key uid;
  3. 分页翻页:ZSet区间截取,长尾分页做限制,只开放前1000页;
  4. 好友榜单:单独构建小范围ZSet,只加入好友ID,轻量化排序。

2. 千万级分页限流

禁止无限制深分页:

  • 前端只开放前1000名查看;
  • 1000名以外用户,不展示完整榜单,仅展示个人名次+前后5名对比。

六、防作弊、防刷榜设计(榜单公平必备)

  1. 分值衰减机制 短期刷分限时衰减,单日异常高分自动折减,杜绝短时间暴力刷榜;
  2. 行为权重校验 机器批量行为低权重,真人有效行为高权重,区分人机刷分;
  3. 波动校验 短时间分值暴涨超过阈值,进入冷却观察期,排名冻结暂缓上升;
  4. 黑名单机制 作弊用户直接剔除榜单,扣分降级,记入黑名单永久标记;
  5. 多维度交叉校验:IP、设备、账号活跃度综合判定刷号团伙。

七、前端展示设计

  1. 顶部固定TOP3特殊样式展示,重点突出;
  2. 榜单列表:名次、头像、昵称、分值、升降名次标识(上升/下降/持平);
  3. 快速定位:一键跳转“我的排名”,展示自己+前后2~5名用户;
  4. 多榜单快速切换,下拉刷新异步加载下一页;
  5. 周期榜单标注倒计时,预告榜单重置时间。

八、高并发扩容兜底方案

  1. Redis集群:主从+哨兵,分片扩容,避免单节点瓶颈;
  2. 削峰:积分变更放入RabbitMQ/Kafka异步队列,削平瞬间流量峰值;
  3. 降级:极端高并发下,关闭长尾分页查询,只保留TOP榜单与个人名次查询;
  4. 兜底:Redis宕机,临时读取最近一次数据库快照做静态榜单应急展示。

九、极简落地落地流程

  1. 定榜单维度、刷新周期、排名规则;
  2. Redis搭建分片ZSet,搭建积分异步队列;
  3. 接入行为统计,增量更新分值;
  4. 接入防刷校验逻辑;
  5. 前端开发榜单展示、分页、个人定位;
  6. 定时落地数据、周期榜单自动归档。

要不要我把这套方案整理成一份条理清晰的榜单需求&架构PPT大纲?