在游戏中有大量的排名需求,比如联盟活跃度排名,战斗场积分排名,互赞排名,游戏金币排名等。本文要讲述是如何设计查看top n的排名,查看某一用户的具体排名。这里的排名参数很简单:一个用户score,score值越大排名越靠前。讲述使用Redis和MySQL两种数据库的存储设计一个满足千万级别用户排名系统。
Redis sorted set 排名
千万用户排名
使用Redis排名非常简单对于百万级别的用户不用耗费太多内存即可实现高效快速的排名,对于用户只有百万的产品,基本设计一个简单的排名基本够用。但大多数游戏不会只有一个排名,都会有多个排名,战斗力排名,消耗金币排名,副本打怪次数都可能成一个榜单,所以使用Redis需要维护大量的排名榜单。现在情景假设你的单节点Redis资源不是很充沛,但允许你搭建Redis集群。上千万用户,仅靠一个sorted set不能够满足你的快速需要。
分桶排名
当用户足够多时,我们需要对排行榜的score依据你的系统用户已有的排名得分数据进行直方图统计,统计出每个score用户数量,然后对score进行合理范围拆分,比如score在0~100万范围,根据直方图统计后 0~10w, 10w~25w, 25w~30w,... ,50w~100w ,10个区间能将一千万用户拆成100w用户一个分桶范围,将对应得分用户分别储存在响应范围的分桶sorted set中。排名时简单缓存每个分桶sorted set的用户总数。对于查询top 排名时,只要查看最高分区桶sorted set排名即可, 对于查询个体用户的排名,需要外加一份用户得分记录存储于MySQL等数据库中,用于查询到单用户的得分