首先,我运行的网站是托管的,我没有权限安装像memcached这样有趣的东西.
我有几个显示HTML表格的网页.这些HTML表的数据是使用昂贵且复杂的MySQL查询生成的.我尽可能地优化了查询,并将索引放在适当的位置以提高性能.问题是,如果我的网站流量很高,MySQL服务器会受到重创,并且会遇到困难.
有趣的是 - MySQL表中的数据不会经常变化.事实上,只有在每隔几周发生一次"事件"后,它才会发生变化.
所以我现在所做的就是:
将生成的HTML表保存到文件中
访问URL时,检查保存的文件(如果存在)
如果文件早于1小时,则运行查询并保存新文件(如果未输出文件)
这确保了对于绝大多数请求,页面加载速度非常快,并且数据最多可以是1小时.为了我的目的,这不是太糟糕.
我真正想要的是保证如果数据库中的任何数据发生更改,则会删除缓存文件.这可以通过查找在表上执行任何更改查询的所有脚本并添加代码来删除缓存文件来完成,但它很脆弱,因为所有未来的更改都需要处理此机制.
有一种优雅的方式来做到这一点?
除了vanilla PHP和MySQL(最新版本)之外我什么都没有 - 我想玩memcached,但我不能.
计算机科学中只有两件难事:缓存失效和命名事物.
-Phil Karlton
对不起,没有多大帮助,但这是真的.
好的 - 认真的回答.
如果你有任何类型的数据库抽象层(希望你会这样),你可以在最后一次更新任何内容时在数据库中维护一个字段,并从抽象层中的单个点管理它.
例如(伪代码): On any update set last_updated.value = Time.now()
然后将其与运行时缓存文件的时间进行比较,以查看是否需要重新查询.
如果您没有抽象层,请为执行此操作的任何SQL更新调用创建包装函数,并始终将包装函数用于任何将来的功能.