node.js存储gamestate,怎么样?

我正在用javascript编写一个游戏,为了防止作弊,我正在服务器上玩游戏(这是一个棋盘游戏,就像一个更复杂的跳棋)。 由于游戏相当复杂,我需要存储游戏状态以validation客户端操作。

是否有可能将游戏状态存储在内存中? 这很聪明吗? 我应该这样做吗? 如果是这样,怎么样? 我不知道如何工作。

我也可以在redis中存储。 这种事情对我来说很熟悉,不需要解释。 但是如果我使用redis进行存储,那么问题是,在每一次移动中,游戏都需要从redis获取数据,并解释和分析这些数据,以便从头开始重新创build游戏状态。 但是由于动作频繁发生,这对我来说似乎很愚蠢。

我该怎么办?

如果你真的不想要I / O的开销,那就把游戏状态存储在由游戏ID键入的全局对象中:

 var global_gamesate = {} 

然后在每个连接上检查游戏ID是要检索他的游戏状态:

 var gamestate = global_gamestate[game_id]; 

大概你已经有一个机制来将客户端会话映射到游戏ID。

通常情况下,游戏状态很小,几乎不占用太多RAM。 让我们悲观,并假设每个游戏状态占用了50万。 然后,您可以在服务器上为每个千兆字节的RAM提供200 个游戏(如果我们假设每个游戏有两个用户,则为400 个用户)。


不过,我想指出的是像MySQL这样的数据库已经实现了caching(这是可configuration的),所以加载最常用的数据基本上是从RAM加载的,具有较小的套接字I / O开销。 数据库的优点是你可以拥有比RAM更多的数据,因为它们将剩余的数据存储在磁盘上。

如果你的程序达到了你开始想写自己的磁盘序列化algorithm来实现交换文件的负载,那么你基本上正在重新发明轮子。 在这种情况下,我会说与数据库。