MongoDB作为MySQL缓存


MongoDB as MySQL cache

我只是有这个想法,并认为这是一个很好的解决方案,但我问是否有一些缺点,这种方法。我有一个经常查询数据库的网页,每次页面加载多达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有一些信息,但这是完全无关的

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

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

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

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

还有mongodb的上限集合和TTL集合是完美的缓存