Javascript node.js如何存储游戏状态?

Javascript node.js如何存储游戏状态?,javascript,database,node.js,Javascript,Database,Node.js,我正在用javascript编写一个游戏,为了防止作弊,我让这个游戏在服务器上玩(这是一个棋盘游戏,就像更复杂的跳棋)。由于游戏相当复杂,我需要存储游戏状态以验证客户端操作 是否可以将游戏状态存储在内存中?这聪明吗?我应该那样做吗?如果是,怎么做?我不知道这怎么行 我也可以在redis中存储。这种事情我很熟悉,不需要解释。但如果我真的将数据存储在redis中,问题是在每次移动中,游戏都需要从redis获取数据,并解释和解析这些数据,以便从头开始重新创建游戏状态。但由于动作频繁,我觉得这很愚蠢 我

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

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

我也可以在redis中存储。这种事情我很熟悉,不需要解释。但如果我真的将数据存储在redis中,问题是在每次移动中,游戏都需要从redis获取数据,并解释和解析这些数据,以便从头开始重新创建游戏状态。但由于动作频繁,我觉得这很愚蠢


我该怎么办?

如果你真的不想要I/O的开销,那么只需将游戏状态存储在由游戏id设置的全局对象中:

var global_gamesate = {}
然后在每个连接上检查游戏id以检索游戏状态:

var gamestate = global_gamestate[game_id];
大概您已经有了一种机制来将客户端会话映射到游戏id

通常,游戏状态很小,几乎不会占用太多内存。让我们悲观一点,假设每个游戏状态占用50万美元。然后,您可以为服务器上的每GB RAM提供200万个游戏(如果我们假设每个游戏有两个用户,则为400万个用户)


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


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

这与JavaScript没有任何关系。基本上,您只需要一个能够处理所有不同连接的客户端的服务器,而且由于程序在内存中执行,因此速度会很快!只有在需要“保存”游戏时才将游戏状态保存到数据库中。用代码表示游戏状态@Marcus谢谢,我正在征求关于实施的建议,因为这对我来说并不明显。如何在代码中表示游戏状态?@expressnoob变量和类。这些是工具,使用它们来表示游戏中的对象,例如
游戏
玩家
Piece
等。设计取决于您,并且特定于您的游戏。@Marcus我如何让它们在服务器上为每个游戏保持持久性?@expressnoob为服务器可能编排的每个游戏创建一个单独的
线程
,并为每个游戏提供一个
游戏的实例,然后,如果持久化是指在服务器关闭后,您可以序列化所有对象并将其保存到文件(或数据库)或以更定制的方式将其转换为数据库表。那么并发性呢?如果两个客户端想同时更改相同的全局游戏状态,它们会不会相互干扰并破坏状态?Javascript没有线程,因此不支持“真正的”并发。所有代码都是原子代码,进程边界进入事件循环(在脚本的最后一行、setTimeout/setInterval条目、ajax回调等之后)。较新的javascript解释器支持工作线程,但在该模型中,所有线程只能通过事件循环进行交互,因此没有并发问题,因为线程不允许共享全局变量(每个线程都有自己的全局范围)。保存服务器状态(所有游戏的进度及其用户)的好方法是什么例如,在重新加载时?@Herokiller:如果您想在重新启动服务器时保持状态,请使用数据库。或者,如果您坚持不使用数据库,请使用
JSON.stringify()
。但我还是鼓励你看看databases@slebetman我的意思是,在任何游戏中每次移动后都可以更新数据库吗?