11

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

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

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

使用 Nginx 之类的东西制作静态、缓存的 HTML 不是首选,因为我想每次都通过 Tornado 呈现个性化页面。

4

2 回答 2

12

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

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

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

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

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

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

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

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

使用 Nginx 之类的东西制作静态、缓存的 HTML 不是首选,因为我想每次都通过 Tornado 呈现个性化页面。

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

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

于 2013-01-09T18:20:36.503 回答
4

Motor (MOngo + TORnado) 包的作者在这里给出了一个缓存他的类别列表的例子:http: //emptysquare.net/blog/refactoring-tornado-code-with-gen-engine/

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

于 2013-01-10T16:15:02.990 回答