我正在开发在线游戏的服务器端部分,其中一项任务是计算用户等级。在完成使用RDBMS的那一刻,它会在每次某个玩家赢得游戏时更新每个用户行。现在,当平均有20名玩家在线时,它会导致僵局。用户排名:如何在没有SQL的情况下执行此操作?
我了解这种趋势 - 当1000个玩家数据库解决方案根本无法工作。
如何在Apache/PHP服务器上实时计算用户排名?它有更智能的数据库解决方案?
我正在开发在线游戏的服务器端部分,其中一项任务是计算用户等级。在完成使用RDBMS的那一刻,它会在每次某个玩家赢得游戏时更新每个用户行。现在,当平均有20名玩家在线时,它会导致僵局。用户排名:如何在没有SQL的情况下执行此操作?
我了解这种趋势 - 当1000个玩家数据库解决方案根本无法工作。
如何在Apache/PHP服务器上实时计算用户排名?它有更智能的数据库解决方案?
你可以把你的等级放在另一个表格中,每个表格中你每次都在TRUNCATE
。 类似的问题已经被问(并回答),并可以在这里找到: Best way to update user rankings without killing the server
伟大的解决方案,谢谢。但是我想知道,如果有一个解决方案根本不使用RDBMS?使用均衡的BST可以轻松解决任务,也许有些东西可以用于Apache/PHP? –
实现了这样一个接近,但它现在会产生大量重复键错误。问题是多个用户可以同时运行等级更新,这会导致查询重叠。似乎解决方案只是将问题转化为其他问题,但并未解决问题。 –
萨米奇的做法呢? –
为什么你存储的行列中一个单独的表呢?根据需要存储分数并查询排名,甚至创建视图。您只需要更新与单个用户相关的数据,而不是更新整个表,如果您使用的是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
问题是我需要能够快速检索用户等级(告诉用户他们的新/旧等级并在他们赢得游戏时改变),并且能够显示不按等级排序的用户等级表,而是由某些其他类别(按字母表,例如)。这就是为什么我需要在每次更改时都要实现用户级别。 –
您的方法涉及每次用户赢得游戏时更新*整个表*,然后选择以特定方式排序的X行。我的方式涉及更新*单行*,然后按特定顺序选择X行。哪一个听起来更快?另外,当执行涉及整个表的操作时,你将永远无法避开目前与之战斗的表级锁死问题。 – Sammitch
还没有明白你的方式,对不起(你可以详细说明它对我来说,请问什么是分数和什么是胜利?用户排名在哪里? –
20个用户发生死锁?听起来像你使用Access。 Y/N? – Sammitch
完全没有。我正在使用MySQL,但当多个用户同时访问数据库时,用户排名更新可能会重叠。我相信这导致了僵局。 –