在MongoDB中缓存重复查询结果

时间:2013-01-09 18:02:51

标签: mongodb caching tornado

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

在上述情况下,当实际数据库更改很少时,将在访问我的主页时执行100个相同的查询。实际上,其中99个查询是浪费计算机能力。是否有任何方法可以缓存第一个查询的结果,当它们在短时间内检测到相同的查询时,是否可以提供缓存的结果?

我使用MongoDB和Tornado。但是,有些帖子说MongoDB没有进行缓存。

使用像Nginx这样的静态缓存HTML不是首选,因为我想每次都通过Tornado呈现个性化页面。

2 个答案:

答案 0 :(得分:8)

  

我使用MongoDB和Tornado。但是,有些帖子说MongoDB没有进行缓存。

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

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

  

实际上,其中99个查询浪费了计算机能力。

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

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

正如我所说的那样,你的情景听起来似乎是在思考浪费的计算机能力。即使您要将此查询缓存在另一个集合/技术中,您也可能会使用相同数量的功率和资源来检索该技术的结果,而不是您只是不打扰。然而,这个假设归结为你有正确的索引,架构,设置等。

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

  

使用像Nginx这样的静态缓存HTML不是首选,因为我想每次都通过Tornado呈现个性化页面。

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

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

答案 1 :(得分:3)

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

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