2009-10-22 43 views
4

首先,我运行的网站是托管的,我无法安装像memcached这样有趣的东西。缓存表结果获得更好的性能......怎么样?

我有几个网页显示HTML表格。这些HTML表格的数据是使用昂贵且复杂的MySQL查询生成的。我尽可能地优化了查询,并提供索引以提高性能。问题是如果我的网站有很高的流量,MySQL服务器就会受到攻击,并且挣扎。有趣的是 - MySQL表中的数据不会经常改变。事实上,它只是在每隔几周发生一次“事件”之后才会改变。

所以,我现在所做的是这样的:

  1. 保存一次生成一个文件
  2. 当网址进入查看保存的文件,如果它存在
  3. 如果该文件是HTML表大于1小时,运行查询并保存新文件,如果不输出文件

这确保了对绝大多数请求页面加载非常快,并且数据最多可以是1小时。为了我的目的,这不是太糟糕。

我真的很想保证,如果数据库中的任何数据发生变化,缓存文件将被删除。这个可能是可以通过查找所有在表上执行任何更改查询并添加代码来删除缓存文件的脚本来完成,但这种方法很脆弱,因为所有将来的更改都需要关注此机制。

有没有一种优雅的方式来做到这一点?

我没有什么,但香草PHP和MySQL(最新版本) - 我想玩memcached,但我不能。

回答

6

好的 - 认真的答案。

如果您有任何类型的数据库抽象层(希望您会这样做),您可以在数据库中维护上次更新任何内容的字段,并从抽象层中的单个点管理该字段。

例如(伪代码):On any update set last_updated.value = Time.now()

然后将此与运行时的缓存文件的时间进行比较,以查看是否需要重新查询。

如果您没有抽象层,为任何执行此操作的SQL更新调用创建包装函数,并且始终使用包装函数来实现任何未来的功能。

+0

我没有抽象层。但是你的文章让我意识到,对于数据库中的每个表,我创建了一个使用自动时间戳的更新列。所以至少我可以做一个简单的查询来检查数据的新鲜度并相应地删除缓存文件。这不是我正在寻找的银弹,但它很闪亮。 – Vamos 2009-10-22 12:15:49

+0

其实,我有一个抽象层排序,至少有一个方法处理所有查询。我可以检查查询是否是UPDATE/INSERT/DELETE之一,如果是,查询运行后,我可以删除相关的缓存文件。不是很好,但它应该达到我想要的一定程度的稳健性。 – Vamos 2009-10-22 13:19:39

7

只有两件难事:计算机科学:缓存失效 并命名事物。

-Phil Karlton

对不起,没有太大的帮助,但它是真实的SOOOOO。

+0

它确实有帮助,你给了我一个关键字来搜索:) – Vamos 2009-10-22 12:11:38

+1

+从来没有听说过,但打肯定回家。 – snicker 2009-10-22 13:13:16

1

您已涵盖大部分的目标,但last_modified字段和cron作业可能会有所帮助。

没有办法从MySQL中删除文件,Postgres会给你那个设施,但MySQL不能。

+0

是 - last_modified,或者在我的情况下更新列(即自动更新)似乎是一个好方法。 – Vamos 2009-10-22 12:18:11

0

您可以使用PHP的output buffering functions将输出缓存到字符串。 Google it,你会发现一个很好的网站收集解释如何完成。

但是,我想知道,您怎么知道数据在一小时后过期?或者你是否假设数据不会在60分钟内大幅改变,以保证页面不断生成?

+0

60分钟限制意味着每60分钟只有1个请求执行繁重的工作并重建缓存文件。这是任意的,我想可以做的是不重建缓存文件,它可以检查数据是否真的发生了变化,如果不是只更新缓存文件的时间戳,以便它再次变得新鲜。 – Vamos 2009-10-22 13:15:04

相关问题