缓存的最佳技术来自不经常更改的查询

时间:2009-03-23 02:09:57

标签: php mysql caching

我有一个php Web应用程序,其中某些数据每周都会更改,但经常会经常阅读。

检索数据的SQL查询和html输出的php代码相当复杂。有多个表连接和大量计算 - 但它们会产生一个相当基本的html表。用户被分组,每周的表对于每个组是相同的,但对于不同的组是不同的。我可能会为成千上万的用户提供数百个表。

出于性能原因,我想缓存这些数据。我不想在每次有人点击页面时运行这些查询和计算,而是希望运行每周一个过程来为每个组生成表格,在需要时给我一个简单的阅读。

我有兴趣知道你成功使用或成功使用了哪些技术?

我可以看到的选项包括:

  • 将计算的html结果存储在由用户组
  • 标识的MySQL表中
  • 将结果数据存储在由用户组标识的MySQL表中(很难,因为没有固定数量的数据项)
  • 在静态文件中缓存页面输出

欢迎任何其他建议!

4 个答案:

答案 0 :(得分:6)

在生成表的函数中,使其将结果存储到磁盘上的文件中:

/cache/groups/1.txt
/cache/groups/2.txt

在调用函数获取数据时,您不一定要为它运行每周批处理作业,检查缓存是否已过期(或不存在)。如果是,则生成并缓存结果。如果没有,只需返回缓存的文件。

function getGroupTable($groupId) {
    if (cacheIsStale($groupId)) {
        generateCache($groupId);
    }
    return file_get_contents($cacheFile);
}

cacheIsStale()函数可以查看file's timestamps以测试新鲜度。

答案 1 :(得分:5)

确实有一些选择:

  • 每周预呈现页面,然后“静态地”为它们服务。
  • 使用缓存(例如Squid)在一周的第一次机会基础上缓存此类响应。例如,您可以配置缓存策略,以便将访问特定页面的请求(例如,very_long.php?...)与网站的其他部分分开缓存。
  • 确保打开数据库缓存。 MySQL有自己的缓存,你可以对其进行微调,以便不重新计算重复的长查询。

答案 2 :(得分:3)

首先,个人资料。验证这些查询确实消耗了大量时间。也许MySQL查询结果缓存已经为你完成了工作。

如果他们真的在消耗资源,那么我要做的是创建一个包含计算结果的表,以及一个完成所有需要管理的过程,在数据发生变化时调用。那些频繁的读取应该只去预先计算的数据,而不用去检查它是否仍然有效。

只需添加一些钩子来修改基础数据或数据库触发器,如果​​可以,这些将不经常执行(每周?),并且可能需要花费大量时间来生成任何结果。

答案 3 :(得分:2)

看来你已经完成了大部分工作。

假设表数据不是很大,另一个选择是使用memcache来缓存结果 - 这可能是更快的解决方案,尽管你需要检查内存需求以确定它是否可行选项。