问题描述
我有一个支持多人浏览器游戏的 socket.io 服务器。单独的正在进行的匹配存储在服务器端内存中的单个对象中:
const matches = {};
当玩家创建比赛时,我会向该对象添加一个新的唯一键,用于跟踪有关该特定游戏的信息。所以当玩家移动时,我会做这样的事情(简化例如代码):
matches[uniqueKeyForMatch] = newValidatedMatchState;
--其中 newValidatedMatchState
是描述此特定匹配项的大型数据树。在这种情况下,“大”意味着其各种子字典和子数组总共包含数百个单独的数值、布尔值和字符串数据。每场比赛大约有 200-800 条单独的数据,例如 5
或 "some text"
。
我想知道的是,如果我有 100 个并发匹配项,matches
对象能否有效地存储这么多数据?从 this question 我看到有一些限制,但我不确定除了字面上有两个变量(如 matches1
和 matches2
并在它们之间拆分数据之外)我还能做什么。有没有更有效的方法来做到这一点?
解决方法
正如在另一个问题中提到的,这不是一个真正的问题。实际上,在达到任何其他类型的限制之前,您将耗尽内存。不过,存储数百/数千个匹配项听起来不是问题。
如果您的匹配项更像是一种您想要存储更长时间的持久数据,您应该开始将您的匹配项存储在文件或数据库中。
如果将其存储在数据库中不符合您的需求,或者您的应用程序只是获得了数据库无法跟上的太多流量,则拆分您的应用程序。拥有多个游戏服务器。您的“主服务器”只会告诉用户“您的游戏在 <server1>
上可用”。
此外,您可能会发现 Map 很有趣,它是一个比常规 JS 对象更好的键值存储对象。