【问题标题】:NodeJS: Using in memory cache for performance and storage for persistanceNode JS:在内存缓存中使用性能和存储以实现持久性
【发布时间】:2018-06-02 17:43:57
【问题描述】:

我想知道我的以下方法是否有意义,或者我是否遗漏了一些缺陷:

问题:SQL 查询很慢。内存中的缓存不是持久的。

我的想法是把我的nodejs进程写在下面的事情上:

  1. 初始化
  2. 从 sql db 中获取当前状态并保存在变量中
  3. 对变量运行所有请求查询
  4. 更新和更改变量,然后更新 sql
  5. 只有在 sql 成功更新后才响应

通过这种方法,我可以完全消除 SQL 对多个表运行复杂查询的情况,并且可以使用 id 作为对象键轻松高效地检查内容。

由于 NodeJS 是单线程的,我什至拥有高效的“事务”功能,因为内存变量的更新将自动发生。

尽管这种方法不允许水平缩放,但我觉得它足以满足我的大多数项目。

我是否遗漏了一些基本缺陷?

【问题讨论】:

  • 一些问题要问自己:某些数据丢失可以吗? (即录制中的丢帧)。是否可以在有限的时间内提供陈旧的数据?为了性能,你能负担得起多少破坏你的架构? (如果 SQL 很慢,为什么不购买更快的服务器?或者具有更多缓存的服务器)
  • 内存中的缓存不是持久化的。”是什么意思?
  • @Bergi 如果服务器崩溃,数据就会消失。通过存储到 sql 并在初始化后获取,我的应用程序将在服务器崩溃中幸存
  • 根本缺陷:你基本上说你想在node.js中实现你自己的数据库引擎。这可能有什么问题?
  • @ThatBrianDude 这就是为什么它被称为“内存中 缓存”,而不是“内存中持久存储”。缓存已经完全符合您的描述,为什么要重新实现它?

标签: javascript node.js


【解决方案1】:

我会想到的事情:

  1. 您的内存限制:您计划在这些变量中保存多少数据?随着时间的推移,这些数据会变得更大吗?如果是,如何管理您的可用内存?

  2. 如果您执行复杂的“查询”,您将无法获得索引(B 树)的 SQL 优势。因此,您的查询必须是简单的查找。对于更复杂的查询,您可以考虑数据的临时/内存表。在 SQLite 中,您可以使用:rc = sqlite3_open(":memory:", &db); (https://www.sqlite.org/inmemorydb.html)。

  3. 我会利用节点 child_process 功能使您的新机制远离您的主线程 (https://nodejs.org/api/child_process.html)。

【讨论】:

  • 1.内存限制不会是问题。我当前的项目将是一个游戏匹配服务器,因此数据将是用户和活动游戏(垂直缩放始终是一个选项)。 2. 如前所述,我可能不需要任何复杂的查询,只需要简单的查找。 3. 这会带来什么改进?
  • 关于第三点。当您的应用程序随时间增长时(例如,更多用户加入您的服务),它将为您提供更大的灵活性。此外,当您以后想要实现需要更复杂数据查找的功能时会发生什么?如果您选择为数据提取操作使用第二个线程,则您的某些用户的响应时间会增加,但您的应用程序不会因所有连接的用户而停止。
  • 我认为子进程会从主进程访问数据?我明白。我会调查这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2012-02-27
  • 2017-07-05
相关资源
最近更新 更多