【问题标题】:Store data from MongoDB query into object and update every 20 minutes将来自 MongoDB 查询的数据存储到对象中并每 20 分钟更新一次
【发布时间】:2014-03-31 23:06:13
【问题描述】:

如果这是一个新手问题,请原谅,因为我是一名尝试学习全栈的前端开发人员。

我的节点应用程序每 20 分钟将记录插入 MongoDB。

每次用户访问页面时都查询数据库似乎不合逻辑,因为数据库在 20 分钟的时间段内都是相同的(直到我每 20 分钟插入新记录)。

我想我可以将查询结果存储在一个对象或其他东西中,并每 20 分钟更新一次该对象(每次插入新记录时,这是一个每 20 分钟运行一次的函数)。

我该怎么做呢?我需要将其作为全局变量吗?

这是一个好主意还是坏主意,为什么?

【问题讨论】:

  • 可能是个坏主意。 MongoDB已经缓存了最近查询的数据——除非你有大量的页面,只要重新查询就可以了,不用担心。

标签: javascript node.js mongodb performance nosql


【解决方案1】:

如果您的查询已编入索引和/或速度很快,那么访问数据库可能是可行的方法。另一种选择是拥有一个缓存层。如果你在原始 node.js 中这样做,你会给自己买很多复杂性(以及可能的性能问题),所以我会远离那个。如果您在其他服务(redis、memcached)中执行此操作,除非查询复杂或缓慢,否则您可能不会看到太多性能提升。如果查询很复杂,您可以每 20 分钟重新生成一次结果并将其保存在 mongo 中的某个位置,然后从中运行查询。例如:

setInterval(regen_stats, 20 * 60 * 1000)

最重要的是,数据库是用来查询的,所以在它停止执行(通常是由于查询的规模或复杂性)之前,您不必开始从它们那里拿走东西

【讨论】:

  • 所以,确保我们都在同一页面上。您是说最好为 100 次页面浏览量查询 100 次数据库,而不是查询数据库 1 次并将数据放入某种缓存对象之类的东西中?那么对于剩下的 99 个页面浏览量,只需提供对象中已有的数据?
  • 如果你只有一个对象,不,但假设你有 n,在某个值 n 时,你会开始遇到内存问题。您还将有缓存构建和缓存失效的复杂性。缓存的问题不是速度,而是复杂性。
  • 同意。缓存很容易,但选择何时失效变得越来越复杂。