如何在需要时使用标签缓存MySQL数据以删除缓存?

时间:2013-11-07 15:35:35

标签: php mysql caching

我一直在网上搜索很长时间,找不到任何缓存系统,允许我在缓存中添加多个标签,以便在数据库更新时删除它,有没有人知道是否有什么东西那样存在吗?

让我向您详细介绍我想做的事情。我有一个PHP网站,在MySQL数据库中有很多重要的查询(超过4000个查询要显示一些页面)。因此,我们的想法是缓存这些查询以减轻数据库的使用量。另一方面,我需要在数据库出现时尽快更新这些信息。

范围很明显,只需要更新缓存而不是一次清空所有缓存,因为只影响一个页面的行稍有变化。无论如何都要用标签来解决这个问题吗?

我已经看过Fastcached和BrennoCache但是只允许1个标签......

[编辑]: 我已经完成了使用FastCache,使用TTL并使用命名系统分配所有缓存元素来清空我需要清空的任何缓存。高速缓存也已应用于可能的最小信息部分,这意味着高速缓存的音调,但非常少的信息高速缓存。意思是更容易清空正确的位。通过这种方式,我们可以从一个页面的4233个查询转到17个页面。

2 个答案:

答案 0 :(得分:2)

Microsoft有一个名为AppFabric的缓存,可以让您为缓存中的项目分配标记列表。 http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx

原来的问题/问题......

根据我的经验,我肯定会建议尝试标记缓存中的项目以进行主动驱逐。

几年前,我试着用你的AppFabric做的,并遇到了很多问题。在我的例子中,让我们考虑一个销售产品的网站。每个产品都有一个ID。

问题:

  1. 产品最终遍及我们的查询。我们有一个单独产品的页面。产品分类。它会一直持续下去。如果我们有一个包含100个产品的缓存项目,它有100个标签吗?这很快变得难以管理。

  2. 让我们假设一个产品在100个不同的缓存对象中。在我们找到每个缓存的项目逐出它们的时候,该项目可能会再次发生变化!换句话说,在处理不断变化的数据时,您必须考虑事务。如果您正在使用缓存进行“写入”,那么您是否会阻止另一个写入不竞争?

  3. 即使你设法从(2)中找出复杂性,我仍然认为它仍然需要时间来执行。您如何向用户反映这一点?

  4. 我对缓存的建议:

    1. 如果可以,请始终使用TTL并让缓存中的项目过期。努力改变你的想法并使用这种方法。如果您可以将90%的数据移动到这种方法,那么您的代码将变得更加简单和易于维护。

    2. 对于无法移动到的项目(1),请确保它们位于一个位置的缓存中。这意味着无需标记项目。需要一些重新分解才能使所有内容都引用该项目,但这是值得的。这样,当你需要使一个项目到期时,你会做一个电话,这很简单。一旦完成,每个人都会获得最新的数据。

答案 1 :(得分:0)

我会使用memcached来存储查询的处理结果,并使用任何数据库更新脚本来清除memcache标记,或者最好使用最新处理的数据重新生成它们。