Php MongoDB作为MySQL缓存

Php MongoDB作为MySQL缓存,php,mysql,mongodb,caching,redis,Php,Mysql,Mongodb,Caching,Redis,我刚刚有了这个想法,认为这是解决这个问题的好办法,但我问这个方法是否有一些缺点。我有一个经常查询数据库的网页,每页加载多达3-5个查询。每个查询都进行了十几次(字面上)连接,然后每个查询结果都用于另一个查询来构造PHP对象。不用说,即使在云端,加载时间也很荒谬,但它现在的工作方式就是这样 我考虑将已经构建好的对象存储为JSON,或者以MongoDB-BSON格式。使用MongoDB作为这种类型的缓存引擎是否是一个好的解决方案?以下是我认为它将如何工作的示例: 当用户打开页面时,如果Mongo中没

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

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

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


    有一些信息,但完全无关。

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


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

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

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


    mongodb和mongodb也非常适合缓存。

    是的,我完全忘了提到,预期数据库中会有50-100k个对象,每个对象大约5-100kB。所以,由于RAM的容量很小,所以不能只使用RAM作为缓存。那么,我肯定认为使用两级缓存会更好。一些实现提供了使用对象优先级进行缓存的可能性。这尤其适用于存储已满、哪些对象存储速度更快、哪些对象存储速度较慢的过期情况。明白了,很高兴你建议使用两级缓存,它可能会解决我遇到的所有问题。作为较慢缓存使用的系统如何?MongoDB还是Redis?正如我所看到的,由于它的灵活性,它一直是Mongo。好吧,你可以同时使用两者(尽管我不是Redis方面的专家)。我认为Redis会更快,所以在这种情况下,我会使用Redis。Redis会在内存中保存所有内容的副本。我将添加主缓存层并再次测量性能。您可能会发现二次缓存不必要。您是否考虑优化MySQL数据库模式,以便不再需要几十个连接来构建页面?使用现有技术并在mysql中构建缓存有什么问题?您添加的技术越多,故障点就越多,维护应用程序所需的知识也就越多。@Philipp是的,您说的技术越多,管理层就越难,这是对的,但这不是一个简单的数据库前端项目,这是一个两年前制作的系统,需要对其web端进行优化。该模式被尽可能地去规范化,以减少连接的出现,但它太复杂了。请解释一下,当上次更新的某个时间过去时,为什么要使用cronjob而不是简单地运行更新?当只查询数据的一部分而另一部分是空闲数据时,它将变得更轻。例如,对于一个网络商店,我不需要在情人节之前像香水和其他类似的东西那样缓存PC产品。是的,如果你不需要,当然要避免它们。它们很昂贵。我只是举了一个例子,我在生产中使用的方法。甚至stackexchange也有用于用户聚合和排名的cronjobs;)是的,对于页面的某些部分,它们是必经之路,比如头版元素。对于记录的过期,在mongo中有TTL索引。查看答案中的链接:)是的,我也考虑过使用它们,谢谢你的链接!