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

Dam*_*isa 6 php mysql caching

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

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

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

我有兴趣知道你成功或成功使用了哪些技术来实现这样的目标?

我能看到的选项包括:

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

任何其他建议将是受欢迎的!

nic*_*ckf 6

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

/cache/groups/1.txt
/cache/groups/2.txt
Run Code Online (Sandbox Code Playgroud)

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

function getGroupTable($groupId) {
    if (cacheIsStale($groupId)) {
        generateCache($groupId);
    }
    return file_get_contents($cacheFile);
}
Run Code Online (Sandbox Code Playgroud)

cacheIsStale()函数可以只查看文件的时间戳来测试新鲜度.


Ass*_*vie 5

确实有一些选择:

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