我正在开发在线游戏的服务器端部分,其中一项任务是计算用户排名。目前它使用 RDBMS 完成,但每次玩家赢得游戏时它都会更新每个用户行。当平均有 20 名玩家在线时,这导致了现在的僵局。
我理解这种趋势——当有 1000 名玩家时,数据库解决方案根本不起作用。
如何在 Apache/PHP 服务器上实时计算用户排名?它有更智能的数据库解决方案吗?
您可以将您的行列放在另一个表中,TRUNCATE
每次都可以。已经提出(并回答)了一个类似的问题,可以在这里找到:
Best way to update user ranking without kill server
为什么将排名存储在单独的表中?根据需要存储分数并查询排名,甚至创建视图。您只需更新与单个用户相关的数据,而不是更新整个表,如果您使用 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