node.js存储游戏状态,怎么样?

exp*_*oob 8 javascript database node.js

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

是否可以将游戏状态存储在内存中?这很聪明吗?我应该这样做吗?如果是这样,怎么样?我不知道那是怎么回事.

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

我该怎么办?

sle*_*man 5

如果您确实真的不想I / O的开销,那么只需将游戏状态存储在以游戏ID为键的全局对象中:

var global_gamesate = {}
Run Code Online (Sandbox Code Playgroud)

然后在每个连接上检查游戏ID是什么,以检索游戏状态:

var gamestate = global_gamestate[game_id];
Run Code Online (Sandbox Code Playgroud)

大概您已经有了一种将客户端会话映射到游戏ID的机制。

通常,游戏状态很小,几乎不会占用太多RAM。让我们感到悲观,并假设每个游戏状态占用500K。然后,您可以为服务器上每GB的RAM 服务200 个游戏(如果假设每个游戏两个用户,则可以提供40 个用户)。


但是,我想指出的是,像MySQL这样的数据库已经实现了缓存(可配置),因此加载最常用的数据基本上是从RAM加载的,而套接字I / O开销很小。数据库的优点是您可以拥有比RAM多得多的数据,因为它们将剩余的数据存储在磁盘上。

如果您的程序曾经达到负载,那么您就开始考虑编写自己的磁盘序列化算法来实现交换文件,那么您基本上就是在重新发明轮子。在这种情况下,我会说数据库。