【问题标题】:Caching repeating query results in MongoDB在 MongoDB 中缓存重复查询结果
【发布时间】:2013-01-09 18:02:51
【问题描述】:

我将构建一个旨在“查看”很多的页面,但很少有用户会“写入”到数据库中。例如,每 100 个用户中只有 1 个可以在我的网站上发布他的新闻,其余的只会阅读新闻。

在上述情况下,当他们访问我的主页时,将执行 100 个 SAME QUERIES,而实际的数据库更改很少。实际上,其中 99 个查询是对计算机能力的浪费。有没有什么方法可以缓存第一个查询的结果,在短时间内检测到同一个查询时,可以把缓存的结果传递出去?

我使用 MongoDB 和 Tornado。但是,有些帖子说 MongoDB 不做缓存。

不推荐使用 Nginx 之类的静态缓存 HTML,因为我想每次都通过 Tornado 呈现个性化页面。

【问题讨论】:

    标签: mongodb caching tornado


    【解决方案1】:

    我使用 MongoDB 和 Tornado。但是,有些帖子说 MongoDB 不做缓存。

    我不知道谁说的,但 MongoDB 确实有缓存查询的方法,实际上它使用操作系统的 LRU 来缓存,因为它本身不进行内存管理。

    只要您的工作集适合 LRU,而操作系统不必不断地对其进行分页或交换,您就应该在大多数情况下从内存中读取此查询。所以,是的,MongoDB 可以缓存,但从技术上讲它不能;操作系统会。

    实际上,这些查询中有 99 个是对计算机能力的浪费。

    解决这类问题的缓存机制在大多数技术中都是相同的,无论是通过 MongoDB 还是 SQL。当然,这只是问题,如果你问我,你可能是在微优化;除非您获得 Facebook 或 Google 或 Youtube 类型的流量。

    缓存主题涉及一个巨大的主题,范围从在预先聚合的 MongoDB/Memcache/Redis 等中缓存查询到缓存 HTML 和其他 Web 资源以尽可能少地在服务器端工作。

    正如我所说,您的情况听起来好像您对浪费的计算机能力的想法是错误的。即使您将此查询缓存在另一个集合/技术中,您也可能会使用相同数量的功率和资源从该技术中检索结果,而不是您不打扰。然而,这种假设归结为您拥有正确的索引、架构、设置等。

    我建议您阅读一些关于良好架构设计和索引创建的链接:

    不推荐使用 Nginx 之类的静态缓存 HTML,因为我想每次都通过 Tornado 呈现个性化页面。

    是的,我认为通过尝试担心查询缓存,您过早地进行了优化,特别是如果您不想起飞,那么每次服务器上 90% 的负载会是多少;加载页面本身。

    我会专注于您的架构和索引,然后在您真的需要时担心缓存。

    【讨论】:

    • 感谢您的回答!但是我认为乔希的回答更适合我。但我仍然会研究索引问题。谢谢你:)
    • @MKYung Hmm 一个模块,它接受一个新的内存查询,使用其结果创建一个新列表(导致 IO),然后对该列表进行查询,导致现在两个集合包含几乎相同的数据同时在内存中,直到 LRU 需要分页内存...我没有看到该模块的完整点,但是好的 :)
    • 从 OP 的问题中我们不知道生成每个页面需要多长时间,因此无法从提供的信息中判断他是过早优化还是微优化。
    • 即使您的用户较少,如果您将内容保存在 RAM 中,也会因为 eac 页面的渲染速度更快而有所不同。尝试使用 memcache 或 redis 执行此操作。很棒
    【解决方案2】:

    Motor (MOngo + TORnado) 包的作者在此处提供了一个缓存类别列表的示例:http://emptysquare.net/blog/refactoring-tornado-code-with-gen-engine/

    基本上,他定义了一个全局类别列表,并查询数据库来填充它;然后,每当他需要页面中的类别时,他都会检查列表:如果存在,则使用它,如果不存在,则再次查询并填写它。他将其设置为在插入数据库时​​使列表无效,但根据您的使用情况,您可以创建一个全局超时变量来跟踪您何时需要重新查询下一次。如果您正在做一些复杂的事情,这可能会失控,但如果它只是最近帖子或其他内容的列表,我认为没问题。

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 2015-04-14
      • 2011-06-05
      • 2018-04-13
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2015-11-04
      • 2014-01-13
      相关资源
      最近更新 更多