我正在开发一款在线游戏的服务器端部分,其中一项任务是计算用户排名。目前它使用的是RDBMS,但每次有玩家赢球时,它都会更新每个用户行。当平均有20个玩家在线时,会导致死锁。
我理解这种趋势-当有1000名球员的数据库解决方案将根本不起作用。
如何在Apache/PHP服务器上实时计算用户排名?有没有更聪明的数据库解决方案?
您可以将您的排名放在另一个表中,每次您都要TRUNCATE
。一个类似的问题已经被问到(并得到了回答),可以在这里找到:在不杀死服务器的情况下更新用户排名的最佳方法
为什么要将排名存储在单独的表中呢?存储分数并根据需要查询排名,或者甚至创建一个视图。你只需要更新与单个用户相关的数据,而不是更新整个表,如果你使用的是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