MongoDB作为MySQL缓存

时间:2013-01-09 07:55:58

标签: php mysql mongodb caching redis

我刚才有了这个想法并且认为这是解决这个问题的一个很好的解决方案,但我问这个方法是否存在一些缺点。我有一个经常查询数据库的网页,每页加载3-5个查询。每个查询都进行十几个(字面上的)连接,然后每个查询结果都用于另一个查询来构造PHP对象。毋庸置疑,即使在云上,加载时间也是荒谬的,但它现在的工作方式也是如此。

我考虑过将已构建的对象存储为JSON,或者将其存储为MongoDB - BSON格式。将MongoDB用作此类缓存引擎会是一个很好的解决方案吗?以下是我认为它将起作用的示例:

  1. 当用户打开页面时,如果Mongo中没有具有正确ID的数据,则对MySQL的查询将触发,每个返回的数据都将转换为正确构造的对象。该对象被发送到视图并转换为JSON并保存在Mongo中。
  2. 如果Mongo中有相应ID的数据,则会将其发送给PHP并进行转换。
  3. 当MySQL中的某些数据发生变化(管理员编辑/删除内容)时,会触发删除功能,删除MongoDB中已编辑/删除的对象。
  4. 使用MongoDB是一种好方法吗?这种方法的缺点是什么?使用Redis完成此任务更好吗?我还需要NoSQL用于项目的其他元素,这就是为什么我正在考虑使用这两个中的一个而不是memcache。

    MongoDB as a cache for frequent joins and queries from MySQL有一些信息,但这完全不相关。

2 个答案:

答案 0 :(得分:7)

我认为最好使用memcached或Redis来缓存查询结果。 MongoDB更像是一个完整的数据库,而不是一个缓存。虽然memcached和Redis都针对缓存进行了优化。

但是,您可以将缓存实现为两级缓存。例如,Memcached不保证数据将保留在缓存中。 (当存储空间满时,它可能会使数据失效)。这使得很难为标记实现系统(例如,您为MySQL表添加标记,然后您可以触发与该表关联的所有查询结果的到期)。一个常见的解决方案是使用memcached进行缓存,以及第二个更慢但更可靠的缓存,它应该比MySQL更快。 MongoDB可能是一个很好的候选者(只要你可以简单地保持对MongoDB的查询)。

答案 1 :(得分:3)

您可以使用Memcached或Redis来缓存对象。 Mongodb也可以用作缓存。我使用mongodb来缓存聚合结果,因为它与Memcached不同,它具有广泛的查询优势。

例如,在标记应用程序中,如果我必须显示与每个标记相对应的页数,它会扫描整个表以查找group by查询。所以我有cronjob通过查询计算该组并将聚合结果缓存在Mongo中。这在我的制作中非常适合我。你也可以为无数其他复杂计算做到这一点。

mongodb capped collectionsTTL collections也非常适合缓存。