![是否可以返回缓存的 Web 响应,然后在后台更新它?](https://linux22.com/image/738115/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%BF%94%E5%9B%9E%E7%BC%93%E5%AD%98%E7%9A%84%20Web%20%E5%93%8D%E5%BA%94%EF%BC%8C%E7%84%B6%E5%90%8E%E5%9C%A8%E5%90%8E%E5%8F%B0%E6%9B%B4%E6%96%B0%E5%AE%83%EF%BC%9F.png)
假设我有一个缓存响应(Web 缓存,完整 html),我想每 30 分钟更新一次。问题是,在这 30 分钟之后,我想为第一个下一个请求提供“旧”缓存版本,然后在后台刷新该请求的缓存并重新执行此操作,以便下一个请求将获得更新的版本。
例如:我有一个缓存于 15:00h 的 /whatever.php 版本。那么在 15:30h 之前,对 /whatever.php 的每个请求都会收到该缓存的 html,而我想要的是 15:30h 之后的第一个请求(即使是在 18:00 或第二天)会收到相同的缓存版本,然后在后台运行一个线程或类似的东西来更新缓存。
我认为这可以通过拥有无限生命周期的缓存并使用强制缓存更新的标头来实现,因此缓存始终提供缓存版本,除非请求强制更新它,但我的问题是:如何处理这种情况下的时间限制以及如何从缓存管理器服务器发出后台请求(curl 或其他)?
是否有任何缓存技术可以让我做这样的事情?
答案1
听完您的评论后,我想我会将您的问题重新表述为:
我如何确保我的缓存始终包含所有对象并且不会发生缓存未命中?
这通常被称为“缓存预热”。
您自己将(定期且重复地)通过抓取您自己的网站来请求每个页面和对象,而不是依靠(第一批)网站访问者和网站的受欢迎程度来保持缓存的填充。
这假设您的缓存有足够的内存来缓存所有对象,并且在第一个对象从缓存中开始过期之前完成对您网站的抓取。
在大型网站上,使此方法更可行的一种策略是从后端服务器设置较长的缓存过期时间。这将防止对象过期过快,减少需要进行的抓取量,并减少后端服务器的负载。
(考虑到下面的注释,您可能希望确保缓存将向网站访问者返回缓存对象的过期时间比后端服务器为缓存服务器设置的过期时间短得多,以便访问者仍能足够频繁地刷新内容。)
一旦您实现了第一个目标,所有对象将始终加载到缓存中,并且您拥有快速的响应时间,下一个障碍可能是您对后端内容所做的更新将需要很长时间才能被访问者看到......
理想情况下,您希望在后端服务器上更新缓存中的特定对象后,立即有选择地使其过期并更新它们,而不是等待它们正常过期或完全清空缓存并从头开始重新填充。
Varnish 和其他公司专门为此提供了支持,通常称为 HTTP清除要求。
发送 PURGE 请求,然后发送普通的 GET 请求,对象将在您的缓存中刷新。甚至已经有特定的插件可以在 Wordpress 中自动执行此操作,只要发布新文章或修改现有文章(即https://wordpress.org/plugins/tags/varnish/)