2

我刚刚有了这个想法,并认为这是解决这个问题的好方法,但我问这种方法是否有一些缺点。我有一个经常查询数据库的网页,每个页面加载多达 3-5 个查询。每个查询都进行十几个(字面意思)连接,然后每个查询结果都用于另一个查询以构造 PHP 对象。不用说即使在云上加载时间也很荒谬,但它现在就是这样工作的。

我考虑将已经构建的对象存储为 JSON 或 MongoDB - BSON 格式。使用MongoDB作为这种类型的缓存引擎会是一个很好的解决方案吗?这是我认为它将如何工作的示例:

  1. 当用户打开页面时,如果 Mongo 中没有具有正确 ID 的数据,则会触发对 MySQL 的查询,每个返回的数据都被转换为正确构造的对象。该对象被发送到视图并转换为 JSON 并保存在 Mongo 中。
  2. 如果 Mongo 中有相应 ID 的数据,则将其发送到 PHP 并进行转换。
  3. 当 MySQL 中的某些数据更改(管理员编辑/删除内容)时,会触发删除函数,该函数也会删除 MongoDB 中已编辑/删除的对象。

它是使用 MongoDB 的好方法吗?这种方法的缺点是什么?使用 Redis 来完成这项任务会更好吗?对于项目的其他元素,我还需要 NoSQL,这就是为什么我正在考虑使用这两个元素之一而不是 memcache。

MongoDB 作为来自 MySQL 的频繁连接和查询的缓存有一些信息,但它完全无关紧要。

4

2 回答 2

7

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

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

于 2013-01-09T08:09:09.303 回答
3

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

例如,在标记应用程序中,如果我必须显示与每个标记对应的页数,它会扫描整个表以进行group by查询。所以我有一个cronjob通过查询计算该组并将聚合结果缓存在 Mongo 中。这对我在生产中非常有效。您也可以对无数其他复杂的计算执行此操作。

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

于 2013-01-09T08:16:16.183 回答