在客户端之间共享状态的服务器上的单个 JS 对象中可以存储多少数据?

问题描述

我有一个支持多人浏览器游戏的 socket.io 服务器。单独的正在进行的匹配存储在服务器端内存中的单个对象中:

const matches = {};

当玩家创建比赛时,我会向该对象添加一个新的唯一键,用于跟踪有关该特定游戏的信息。所以当玩家移动时,我会做这样的事情(简化例如代码):

matches[uniqueKeyForMatch] = newValidatedMatchState;

--其中 newValidatedMatchState 是描述此特定匹配项的大型数据树。在这种情况下,“大”意味着其各种子字典和子数组总共包含数百个单独的数值、布尔值和字符串数据。每场比赛大约有 200-800 条单独的数据,例如 5"some text"

我想知道的是,如果我有 100 个并发匹配项,matches 对象能否有效地存储这么多数据?从 this question 我看到有一些限制,但我不确定除了字面上有两个变量(如 matches1matches2 并在它们之间拆分数据之外)我还能做什么。有没有更有效的方法来做到这一点?

解决方法

正如在另一个问题中提到的,这不是一个真正的问题。实际上,在达到任何其他类型的限制之前,您将耗尽内存。不过,存储数百/数千个匹配项听起来不是问题。

如果您的匹配项更像是一种您想要存储更长时间的持久数据,您应该开始将您的匹配项存储在文件或数据库中。

如果将其存储在数据库中不符合您的需求,或者您的应用程序只是获得了数据库无法跟上的太多流量,则拆分您的应用程序。拥有多个游戏服务器。您的“主服务器”只会告诉用户“您的游戏在 <server1> 上可用”。

此外,您可能会发现 Map 很有趣,它是一个比常规 JS 对象更好的键值存储对象。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...