游戏服务器中实时显示的全服排名是怎么实现的?

时间:2021-10-28 18:17:28
游戏服务器中实时显示的全服排名是怎么实现的?

排名算的是综合攻击力,血条,防御,人气,4个值加起来,100w-10w人同时在线

请问用什么数据结构和算法实现,求各位大神前辈指点

zookeeper这种东西能行吗

9 个解决方案

#2


百度搜相关关键字。

#3


才100万记录,用数据库就可以了,建立一个排名视图(view)

#4


引用 楼主 wangyaninglm 的回复:
游戏服务器中实时显示的全服排名是怎么实现的?

排名算的是综合攻击力,血条,防御,人气,4个值加起来,100w-10w人同时在线

请问用什么数据结构和算法实现,求各位大神前辈指点

zookeeper这种东西能行吗

每过一段时间,同步一下缓存就好了。
这个地方肯定要用缓存的

#5


1、全服排名 也有不同的情况的,看是不是每个人都要知道自己的具体名次
2、全服排名 跟 同时在线人数没有什么必然的联系,应该是跟数据库里面总的玩家记录数有关

比如有的游戏是只有top100才显示具体名次,100名之后的只提示 您超过了 XX% 的玩家

如果所有人都要给具体名次的话,就比较蛋疼一点,做一个 玩家id <-> 排名  的双向映射表,开服load一遍数据库,把这个表初始化好,然后当要排名的那个数值变动的时候, 增加则向前搜超过了哪些人,逐个交换名次;减少则向后搜落后于哪些人,逐个交换名次

另外一种替代方案是,比如我有100W玩家,我就固定有100w个名次,刚开服一开始都是机器人,就是让玩家自己pvp去打排名(而不是服务器主动排名),你能赢了前一个人,你就和前一个人的名次交换,你能直接赢第一名,你就和第一名进行名次交换,被交换下去的玩家,自己去重新打排名

如果不是每个玩家都要给具体名次,比如只需要top100,就好办一点,前100个人,就事实排就好, 新来一个人,就判断能不能进前100,能进,再计算具体名次;
不能进,就是100名之后的。
然后对于所有100名之后的玩家,按数值区间建立若干个桶,比如我们预计要排名的那一个数据的最大值能到1W。我建立0-10, 10-100,100-1000, 1000-2000, 2000-5000, 5000-10000 这样6个桶,每个桶里面记录分值在这个桶对应的区间内,有多少个玩家。 比如
0-10, 10人
10-100,20人
100-1000,30人
1000-2000, 40人
2000-5000, 50人
5000-10000, 60人
那么如果一个玩家 是 1234分,那么他的排名就超过了 (10 + 20 + 30)/ (10 + 20 + 30 + 40 + 50 + 60)这个百分比的玩家(所以桶分的越细,后面的排名越精确)

#6


100万峰值,注册可能几千万甚至过亿了吧
没接触过这么大的数,以前听人说过亿只能用桶排序,就是楼上说的,没验证过
给大佬递茶 游戏服务器中实时显示的全服排名是怎么实现的?

#7


看看..........

#8


直接用数据库吧?100万的数据连mysql都不会觉得吃力,定期取最大数据后存储,游戏中只做查询就行了

#9


该回复于2018-05-19 11:32:47被管理员删除

#1


#2


百度搜相关关键字。

#3


才100万记录,用数据库就可以了,建立一个排名视图(view)

#4


引用 楼主 wangyaninglm 的回复:
游戏服务器中实时显示的全服排名是怎么实现的?

排名算的是综合攻击力,血条,防御,人气,4个值加起来,100w-10w人同时在线

请问用什么数据结构和算法实现,求各位大神前辈指点

zookeeper这种东西能行吗

每过一段时间,同步一下缓存就好了。
这个地方肯定要用缓存的

#5


1、全服排名 也有不同的情况的,看是不是每个人都要知道自己的具体名次
2、全服排名 跟 同时在线人数没有什么必然的联系,应该是跟数据库里面总的玩家记录数有关

比如有的游戏是只有top100才显示具体名次,100名之后的只提示 您超过了 XX% 的玩家

如果所有人都要给具体名次的话,就比较蛋疼一点,做一个 玩家id <-> 排名  的双向映射表,开服load一遍数据库,把这个表初始化好,然后当要排名的那个数值变动的时候, 增加则向前搜超过了哪些人,逐个交换名次;减少则向后搜落后于哪些人,逐个交换名次

另外一种替代方案是,比如我有100W玩家,我就固定有100w个名次,刚开服一开始都是机器人,就是让玩家自己pvp去打排名(而不是服务器主动排名),你能赢了前一个人,你就和前一个人的名次交换,你能直接赢第一名,你就和第一名进行名次交换,被交换下去的玩家,自己去重新打排名

如果不是每个玩家都要给具体名次,比如只需要top100,就好办一点,前100个人,就事实排就好, 新来一个人,就判断能不能进前100,能进,再计算具体名次;
不能进,就是100名之后的。
然后对于所有100名之后的玩家,按数值区间建立若干个桶,比如我们预计要排名的那一个数据的最大值能到1W。我建立0-10, 10-100,100-1000, 1000-2000, 2000-5000, 5000-10000 这样6个桶,每个桶里面记录分值在这个桶对应的区间内,有多少个玩家。 比如
0-10, 10人
10-100,20人
100-1000,30人
1000-2000, 40人
2000-5000, 50人
5000-10000, 60人
那么如果一个玩家 是 1234分,那么他的排名就超过了 (10 + 20 + 30)/ (10 + 20 + 30 + 40 + 50 + 60)这个百分比的玩家(所以桶分的越细,后面的排名越精确)

#6


100万峰值,注册可能几千万甚至过亿了吧
没接触过这么大的数,以前听人说过亿只能用桶排序,就是楼上说的,没验证过
给大佬递茶 游戏服务器中实时显示的全服排名是怎么实现的?

#7


看看..........

#8


直接用数据库吧?100万的数据连mysql都不会觉得吃力,定期取最大数据后存储,游戏中只做查询就行了

#9


该回复于2018-05-19 11:32:47被管理员删除