排名算的是综合攻击力,血条,防御,人气,4个值加起来,100w-10w人同时在线
请问用什么数据结构和算法实现,求各位大神前辈指点
zookeeper这种东西能行吗
9 个解决方案
#2
百度搜相关关键字。
#3
才100万记录,用数据库就可以了,建立一个排名视图(view)
#4
每过一段时间,同步一下缓存就好了。
这个地方肯定要用缓存的
#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)这个百分比的玩家(所以桶分的越细,后面的排名越精确)
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
#1
#2
百度搜相关关键字。
#3
才100万记录,用数据库就可以了,建立一个排名视图(view)
#4
每过一段时间,同步一下缓存就好了。
这个地方肯定要用缓存的
#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)这个百分比的玩家(所以桶分的越细,后面的排名越精确)
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都不会觉得吃力,定期取最大数据后存储,游戏中只做查询就行了