千万级用户排行榜整体设计方案
适配千万级海量用户高并发读写、实时刷新、榜单公平防作弊、多维度榜单、海量数据分页查询,分为业务规则设计、架构分层设计、数据库存储设计、排序算法、缓存方案、防刷机制、前端展示、扩容优化8个模块。
一、基础业务规则设计(定榜单底层逻辑)
1. 榜单分类
- 实时榜单:小时榜、实时战力榜、在线榜单,秒级更新;
- 周期榜单:日榜、周榜、月榜、赛季榜,周期结算归档;
- 分类榜单:总榜、地区榜、赛道榜、新人榜、氪金榜、活跃度榜;
- 个性化榜单:好友排行榜、同城排行榜、关注榜单。
2. 排名规则
- 主排序:核心分值(活跃度、积分、贡献值、战力)降序;
- 次要排序:分值相同时,优先对比首次达到该分值时间,越早排名越高;
- 名次定义:1/2/3名为TOP3,后续统一为第N名,不并列同名次。
3. 榜单时效与重置
- 短时榜单:整点/零点自动清零重新统计;
- 长周期榜单:结束后归档历史榜单,生成历史榜单快照,支持回溯查看往期排名。
二、整体技术架构(千万级高并发核心)
采用前端→网关→应用服务→多级缓存→持久化数据库分层架构,读写分离,热点数据全缓存。
- 接入层:网关限流、防恶意刷榜请求拦截,削峰;
- 业务服务层
- 积分统计服务:异步统计用户行为,计算分值,禁止同步计算排行榜;
- 榜单计算服务:定时+增量刷新榜单,不全局全量重排;
- 查询服务:专门承接榜单查看、分页、个人排名查询;
- 缓存层(核心):Redis集群承担99%榜单查询,持久层仅落地归档数据;
- 持久层: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. 辅助缓存
- 热点TOP榜单:TOP10、TOP50、TOP100缓存为String/List,前端直取,无需遍历ZSet;
- 个人名次缓存:
user:rank:类型:uid,缓存个人实时名次,过期自动刷新; - 周期快照缓存:榜单结束后,将完整榜单快照存入Hash永久缓存。
4. 更新策略(拒绝高频全量重排)
- 增量更新:用户行为加分/扣分,仅
ZINCRBY单条修改分值,Redis自动维护排序; - 批量合并:高并发场景,使用队列攒50~200条积分变更,批量写入Redis,降低IO。
四、数据库持久化设计
1. 数据表拆分
- 用户基础积分表 uid、总积分、日积分、周积分、上次更新时间、标签,按uid分库分表;
- 榜单归档表 榜单类型、周期、uid、名次、积分、上榜时间,用于历史榜单查询、对账;
- 行为日志表 记录加分来源,用于作弊溯源、数据复盘。
2. 读写规范
- 读:榜单查询绝不查MySQL,全部走Redis;
- 写:实时积分变更只写Redis,定时任务(5~30分钟)异步落地MySQL做备份;
- 结算:榜单周期结束,一次性把榜单数据落库归档。
五、排序与查询设计
1. 常用查询场景实现
- 查TOPN榜单:
ZREVRANGE key 0 N-1,毫秒返回; - 查个人排名:
ZREVRANK key uid; - 分页翻页:ZSet区间截取,长尾分页做限制,只开放前1000页;
- 好友榜单:单独构建小范围ZSet,只加入好友ID,轻量化排序。
2. 千万级分页限流
禁止无限制深分页:
- 前端只开放前1000名查看;
- 1000名以外用户,不展示完整榜单,仅展示个人名次+前后5名对比。
六、防作弊、防刷榜设计(榜单公平必备)
- 分值衰减机制 短期刷分限时衰减,单日异常高分自动折减,杜绝短时间暴力刷榜;
- 行为权重校验 机器批量行为低权重,真人有效行为高权重,区分人机刷分;
- 波动校验 短时间分值暴涨超过阈值,进入冷却观察期,排名冻结暂缓上升;
- 黑名单机制 作弊用户直接剔除榜单,扣分降级,记入黑名单永久标记;
- 多维度交叉校验:IP、设备、账号活跃度综合判定刷号团伙。
七、前端展示设计
- 顶部固定TOP3特殊样式展示,重点突出;
- 榜单列表:名次、头像、昵称、分值、升降名次标识(上升/下降/持平);
- 快速定位:一键跳转“我的排名”,展示自己+前后2~5名用户;
- 多榜单快速切换,下拉刷新异步加载下一页;
- 周期榜单标注倒计时,预告榜单重置时间。
八、高并发扩容兜底方案
- Redis集群:主从+哨兵,分片扩容,避免单节点瓶颈;
- 削峰:积分变更放入RabbitMQ/Kafka异步队列,削平瞬间流量峰值;
- 降级:极端高并发下,关闭长尾分页查询,只保留TOP榜单与个人名次查询;
- 兜底:Redis宕机,临时读取最近一次数据库快照做静态榜单应急展示。
九、极简落地落地流程
- 定榜单维度、刷新周期、排名规则;
- Redis搭建分片ZSet,搭建积分异步队列;
- 接入行为统计,增量更新分值;
- 接入防刷校验逻辑;
- 前端开发榜单展示、分页、个人定位;
- 定时落地数据、周期榜单自动归档。
要不要我把这套方案整理成一份条理清晰的榜单需求&架构PPT大纲?