2013-01-16 63 views
0

我正在开发在线游戏的服务器端部分,其中一项任务是计算用户等级。在完成使用RDBMS的那一刻,它会在每次某个玩家赢得游戏时更新每个用户行。现在,当平均有20名玩家在线时,它会导致僵局。用户排名:如何在没有SQL的情况下执行此操作?

我了解这种趋势 - 当1000个玩家数据库解决方案根本无法工作。

如何在Apache/PHP服务器上实时计算用户排名?它有更智能的数据库解决方案?

+0

20个用户发生死锁?听起来像你使用Access。 Y/N? – Sammitch

+0

完全没有。我正在使用MySQL,但当多个用户同时访问数据库时,用户排名更新可能会重叠。我相信这导致了僵局。 –

回答

2

你可以把你的等级放在另一个表格中,每个表格中你每次都在TRUNCATE。 类似的问题已经被问(并回答),并可以在这里找到: Best way to update user rankings without killing the server

+0

伟大的解决方案,谢谢。但是我想知道,如果有一个解决方案根本不使用RDBMS?使用均衡的BST可以轻松解决任务,也许有些东西可以用于Apache/PHP? –

+0

实现了这样一个接近,但它现在会产生大量重复键错误。问题是多个用户可以同时运行等级更新,这会导致查询重叠。似乎解决方案只是将问题转化为其他问题,但并未解决问题。 –

+0

萨米奇的做法呢? –

1

为什么你存储的行列中一个单独的表呢?根据需要存储分数并查询排名,甚至创建视图。您只需要更新与单个用户相关的数据,而不是更新整个表,如果您使用的是InnoDB表,则UPDATE查询将使用行级锁而不是使用myISAM获得的表级锁。

TABLE users 
    user_id INT PK 
    user_name VARCHAR 
    ... 

TABLE user_scores 
    user_id PK FK 
    score INT INDEX 
    wins INT INDEX 

VIEW v_user_ranks 
    SELECT u.user_id, u.user_name, s.score, s.wins 
    FROM users u INNER JOIN user_scores s 
    ON u.user_id = s.user_id 

SELECT * 
FROM v_user_ranks 
ORDER BY score, wins DESC 
LIMIT 10 

INSERT INTO user_scores (user_id, score, wins) 
    VALUES ($id, $score, $wins) 
    ON DUPLICATE KEY UPDATE score=score+$score, wins=wins+$wins 
+0

问题是我需要能够快速检索用户等级(告诉用户他们的新/旧等级并在他们赢得游戏时改变),并且能够显示不按等级排序的用户等级表,而是由某些其他类别(按字母表,例如)。这就是为什么我需要在每次更改时都要实现用户级别。 –

+0

您的方法涉及每次用户赢得游戏时更新*整个表*,然后选择以特定方式排序的X行。我的方式涉及更新*单行*,然后按特定顺序选择X行。哪一个听起来更快?另外,当执行涉及整个表的操作时,你将永远无法避开目前与之战斗的表级锁死问题。 – Sammitch

+0

还没有明白你的方式,对不起(你可以详细说明它对我来说,请问什么是分数和什么是胜利?用户排名在哪里? –

相关问题