我应该如何在node.js中保留socket.io交互的临时数据?

时间:2016-08-26 18:12:46

标签: node.js database memory socket.io relational-database

我正在使用socket.io在node.js中构建一个简单的游戏。我对node.js的网络体验通常涉及将所有内容保存到关系数据库并且不在内存中保留任何内容。我为游戏状态设置了一个关系数据库。我正在使用sqlite3进行开发,我可能会使用像PostgreSQL或MySQL这样的东西进行开发。

我担心的是,每次从套接字发出事件时,整个游戏状态都会从服务器加载到内存中。我觉得在实践中,这比将所有游戏状态数据保存在内存中效率低。在比赛期间,事件可能每5秒左右发出一次。所有游戏数据都是暂时的,游戏结束后不需要任何游戏数据。游戏状态由一组约120组小字符串和整数组成(每组约10个但可能会发生变化)。

将此类数据保存在内存中是不错的做法?

如果没有,我应该坚持使用关系数据库还是切换到第三个选项,比如基于文件的存储结构?

我是否应该为每个事件加载整个游戏状态,即使这会导致更多的读/写(至少三次)?

2 个答案:

答案 0 :(得分:1)

我不会将这些数据保存在NodeJS应用程序的内存中。最好避免在应用服务器中存储状态。如果您确实需要比sql提供的更快的读取访问权限,请考虑使用像Redis或Memcached这样的缓存作为应用程序和数据库之间的层。

最好不要过早地优化代码。大多数SQL引擎都有自己的缓存形式,如果遇到性能问题,优化sql查询是一个更好的起点。 Postgresql Query Optimization

但是不要担心它直到它出现实际问题(因为它很可能永远不会出现)。

答案 1 :(得分:0)

听起来像关系,SQL类型数据库对于您的细节来说是一个巨大的开销。您是否知道您的数据有多大以及您想要处理多少用户?然后你可以将它与你的服务器能力进行比较。如果结果是否定的(无法用mem处理) - 那么我会选择一些快速的nosql,比如mongo。对于你的例子,它听起来是最好的选择。它可以更快地获取单个会话的数据,更容易转储,结构更具弹性。