【问题标题】:How can I cache MySQL data using tags to delete the cache when needed?如何在需要时使用标签来缓存 MySQL 数据以删除缓存?
【发布时间】:2013-11-25 20:33:20
【问题描述】:

我已经在网上搜索了很长时间,但找不到任何缓存系统可以让我将多个标签添加到缓存中以便能够在数据库更新时将其删除,有没有人知道是否有什么这样的存在吗?

让我告诉你更多关于我想做的事情的细节。我有一个 PHP 网站,它在 MySQL 数据库中执行非常繁重的查询(要显示的某些页面超过 4000 个查询)。所以想法是缓存这些查询以减轻数据库的使用。另一方面,我需要在数据库更新时尽快更新这些信息。

范围仅明确需要更新的缓存,而不是一次清空所有缓存,因为一行中的细微变化仅影响一页。有没有办法用标签解决这个问题?

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

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

【问题讨论】:

  • MySQL 已经使用了自己的缓存:dev.mysql.com/doc/refman/5.1/en/query-cache.html。这也可以回答你的问题:stackoverflow.com/questions/2173201/…
  • 除了如果确实需要 4000 次查询来呈现单个页面,您可能需要重新审视您的设计,大多数缓存系统都允许您控制缓存中对象的 TTL,以及提供从缓存中驱逐项目的方法。不幸的是,如果不了解更多有关应用程序行为的信息(单个缓存元素的大小,整体缓存的预期大小,缓存中数据的基数,预期什么),我们无法真正推荐任何东西缓存中项目的访问率,从缓存中实现的请求百分比的期望目标等
  • 我也认为如果有超过 4000 个查询来构建一个页面,数据库或收集其中信息的方式存在一些设计问题。不幸的是,我只在最后一条直线上被要求在项目中寻求帮助,并且不能要求那种修订。关于缓存信息,我只能说我们正在讨论要缓存的 12,000 个不同的查询,每个查询应该小于 10kb。表之间有许多继承链接,所有内容的组合方式是使用循环......

标签: php mysql caching


【解决方案1】:

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

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

根据我的经验,我绝对建议不要尝试在缓存中标记项目以进行主动驱逐。

几年前,我尝试完全按照您使用 AppFabric 的方式进行操作,但遇到了许多问题。对于我的示例,让我们考虑一个销售产品的网站。每个产品都有一个 ID。

问题:

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

  2. 让我们假设一种产品位于 100 个不同的缓存对象中。在我们找到每个缓存的项目驱逐它们的时间里,该项目可能再次发生了变化!换句话说,在处理不断变化的数据时,您将不得不考虑事务。如果您正在使用缓存进行“写入”,是否会阻塞以防止其他写入竞争?

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

我对缓存的建议:

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

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

【讨论】:

  • 感谢 AppFabric 的链接,但服务器在 Debian 上运行。我将与首席开发人员聊天,看看他对 TTL 的看法,因为这涉及更多“静态”条目我想知道这是否是正确的方法,因为一方面为什么要等待重新创建,另一方面为什么当什么都没有改变时重新创建。
  • 我选择这个答案作为最好的输入,最有价值的信息,而不是作为我问题的完整答案;)
【解决方案2】:

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

【讨论】:

  • 重点是使用多个标签能够只清空必要的缓存以避免不必要的重新缓存,但感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2021-04-04
  • 2014-07-04
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多