0

我正在开发在线游戏的服务器端部分,其中一项任务是计算用户排名。目前它使用 RDBMS 完成,但每次玩家赢得游戏时它都会更新每个用户行。当平均有 20 名玩家在线时,这导致了现在的僵局。

我理解这种趋势——当有 1000 名玩家时,数据库解决方案根本不起作用。

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

4

2 回答 2

2

您可以将您的行列放在另一个表中,TRUNCATE每次都可以。已经提出(并回答)了一个类似的问题,可以在这里找到: Best way to update user ranking without kill server

于 2013-01-16T15:34:30.350 回答
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
于 2013-01-16T17:18:07.063 回答