功能是这样的: 游戏里面有 pvp 功能,每天 22 点都会根据 pvp 积分进行结算然后发放奖励
现在的做法是: 专门开一个服务,定点统计所有玩家 pvp 积分排名,然后奖励
但是考虑到如果用户量特别大的话,耗时严重,结算也不太准确( 22 点的时候有玩家玩 pvp 更新了积分,但还没统计到他)
想了半天也没有想到更加合理的办法,所以问问 v 友们
1
woscaizi 2019-02-23 16:02:37 +08:00 via iPhone
给积分加个更新时间字段,到时直接选取时间范围内按照积分 order by desc 的结果?
|
2
xiaotuzi 2019-02-23 16:03:49 +08:00 via iPhone
(曾维护过 xxx 平台复利计息系统,他们机器每天 23 点更新分红,几乎每天都炸(˶‾᷄⁻̫‾᷅˵))
PHP 的程序,PHP 在特别庞大复杂计算的时候会很慢,跟你的问题差不多吧。 解决方案如下:(简单-复杂) (处理过的数据一定要加更新时间,防止重复操作) 1,如果计算的数据结果可以延迟一两小时到客户账户,且不会造成其他影响,那么就发布公告:xx 数据更新时间是 22:00-23:00 之间。那么这段时间就慢慢处理数据吧,反正结果不会影响客户操作。 2,多线程数据库分割处理。10w 数据,分为 5w+5w,两个线程处理,或者更多划分,以达到最快速度处理完(服务器要求要高)。(加服务器,分布式处理更复杂一点,需要数据再集中一次,看你如何操作了) 3,整体系统积分设计上调整。每个用户每个操作有积分获取或者扣除的,能立刻得出结果,不必要统一批处理。(目测基本不可能这么玩) 仅供参考。 |
3
song0071000 2019-02-23 16:09:48 +08:00
减少要排序的数据量
一定要给所有的玩家做排序?过滤部分 pvp 积分很小玩家 |
4
wake156 2019-02-23 16:13:12 +08:00
用户 id 和对应积分放到缓存里,然后 22:00 点开始结束计分,开始排序结算,22:15 或者 22:30 发放奖励
这样行不? |
5
wake156 2019-02-23 16:22:04 +08:00
用户数量级别不可能是天文数字,不太可能导致排序慢
|
6
chinvo 2019-02-23 16:23:11 +08:00
比较同意 @xiaotuzi #2,尤其是第三条,可以在每个得分点就进行积分操作,积分分为积分日志和按天归档日志,在按天归档日志里,每条记录都是一个用户从昨天 22:00 到今天 22:00 的 pvp 积分和(每次增加积分日志的时候就给按天归档日志做一个庚新),22 点的时候跑后台进程做排序甚至直接用数据库的查询语句排序就完了
|
7
ymj123 2019-02-23 16:27:35 +08:00 via Android
你游戏上线了吗?别到时候玩家都没几个,根本没这个烦恼。😂
|
8
zhy0216 2019-02-23 16:31:53 +08:00 via iPhone
如果只关心比如说前一千名的玩家 可以开个 1000 的数组 每次拿比如 5 万数据遍历 然后更新那个数组
应该比直接排序快 |
9
pkokp8 2019-02-23 16:34:40 +08:00 via Android
产生积分的时候就计算规定时间的总合,分散计算的强度
|
10
justbuy 2019-02-23 16:42:55 +08:00 via iPhone
10:30 发奖励
|
11
flyzero OP 好像只能需要一个时间段来处理了
|
12
misaka19000 2019-02-23 16:54:50 +08:00 via Android
用 spark 来算
|
13
JamesR 2019-02-23 17:06:56 +08:00
搞笑,有多少玩家啊,千万级别万家有吗?
千万级别玩家在普通数据库里照样 2-3 秒完成计算。 |
14
zzj0311 2019-02-23 17:12:39 +08:00 via Android
又不需要实时发奖,慢慢算呗
|
15
Amit 2019-02-23 17:13:34 +08:00
1、从业务方面加限制,特定任务限制时间段
2、使用流计算,就是有点太重了 一般游戏里面排名都不是实时的,会等到第二天或下周更新排名 |
16
changnet 2019-02-23 17:29:26 +08:00 via Android 1
1. 这个功能为啥不是游戏服务器做而是游戏后台做
2. 就个积分排序,几万人直接内存中排就完了 3.人实在是太多,有几百万上亿,分段排即可,又不需要实时发奖励 我很好奇用户量特别大是有多大,耗时严重有多严重? 因为我见过的游戏服务器数据都是常驻内存,全服几万人排序都是毫秒级别的,排个奖励都是直接排的,没特殊处理 |