Node.js,将对象存储在内存中还是数据库中?

3

我正在开发一个node js应用程序,它从集中式数据库读取json列表。

如果以文本文件形式保存,Object列表大约有1.2mb。

需求是每24小时刷新一次数据,所以我设置了一个cron job来执行此操作。

现在,在获取数据后,我将其保存到运行在我的服务器上的本地数据库(couchbase)中。

数据访问非常频繁,我每秒收到大约1或2个请求,几乎所有请求都需要使用该Object

是在node js中将该Object作为内存对象保存还是将其保存在本地数据库中更好?

两者各有优缺点,具体如下:

  • Object保存为内存对象:
    • 优势:快速读取和响应,不需要与本地数据库进行通信。
    • 劣势:当您需要扩展应用程序时,可能会受到内存限制的影响。

  • Object保存在本地数据库中:
    • 优势:在需要扩展应用程序时,数据可以轻松地移动到另一个服务器。
    • 劣势:每次读取Object时都需要与本地数据库进行通信,可能会降低响应速度。

Object对所有请求只读取一次,仅由cron job写入。

这是一种高端系统,具有i7四核和16GB RAM。


一个 "InProc" 对象的访问速度比任何数据库都要快得多。但显然会使用大量内存。您还需要注意内存泄漏问题。总之,正确的答案完全取决于您更广泛的实现,因此您可能是唯一能回答这个问题的人。尝试一下并查看效果。 - Liam
取决于你是否开始复制对象,如果这样做可能会消耗大量的内存,但如果正确地执行,则内存中的对象在性能方面会更快。 - Paradoxis
在尝试时,我只是将它保留为一个 JSON 对象,并在 module.exports 中公开该对象,以便我可以从其他位置访问它。同时,在从其他位置访问它时,我会进行预检查以确保它是否为空?这样做好吗? - Aishwat Singh
这听起来像是正确的方法。不过,数据是否可变? - Randy
如果您需要性能,请将其保留在内存中。如果您需要性能但无法负担RAM,最终您将购买更多的RAM。因此,这取决于您是否需要性能。如果您不需要性能,则无需将其保留在内存中 - 只需从数据库中提取即可。请考虑不能将数据保存在内存中的语言使用单独的服务器来执行此操作:memcached。因此,如果您需要性能,则这是一个好主意。个人认为,在每秒1或2个请求时,您不需要它。Node.js可以轻松处理500多个请求/秒。我建议在达到约100个请求/秒时再执行此操作。 - slebetman
@slebetman,提高配置不是问题,顺便感谢。 - Aishwat Singh
2个回答

5
  1. 这取决于您的硬件条件。
  2. 如果对象是不可变的,每次请求都是如此,最好将其保留在内存中。否则就要看情况而定。
  3. 无论如何,工作流程打开数据库连接、获取数据、返回结果和释放数据都将消耗比缓存更多的资源。

例如,在我们的项目中,我们处理高清晰度图片,并将所有对象保存在内存中 - 原始格式为3-7mb。测试显示,这比使用任何缓存系统(如Redis或Couchbase)更有效率。


原子对象是不可变的。 - Aishwat Singh

1

我会将最新版本作为内存对象保留,并进行存储。这样,如果出现任何问题,您就有备份。但如果您编辑文件,则只需将其保留为数据库对象。

每2秒钟访问该对象的数据库可能效果良好,但1.2MB的内存并不算太多,如果您可以将其限制在范围内,您的服务器不太可能遇到问题。

与内存相比,数据库稍微慢一点,但它有一个优势(最有可能)是线程安全的。如果您编辑文档,则可能会在内存对象中遇到线程问题。

您知道应用程序和要求,应该能够确定您是否需要线程安全的数据库,或者是否需要在服务器上保护您的内存。如果您不知道,我们需要查看实际代码和用例,才能告诉您最好的做法。


我会把文本文件作为备份。 - Aishwat Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接