如前所述,客户端浏览器需要一个请求来知道数据已经更新。以下是我会在您的案例中研究的一些解决方案:
服务器端缓存(数据仍需要网络传输):
-
根据您的环境,我会使用“过时和更新”策略设置Nginx + FastCGI缓存。因此,始终提供缓存(快速),并且始终刷新缓存。因此,在代码更新后,只有少数请求(一个或多个,具体取决于刷新缓存的时间)会使用过时的数据提供服务。此缓存是基于URL的,因此,如果您的内容是基于cookie/会话的,则可能会变得棘手。
-
正如@ZachRobichaud所说,您可以使用Laravel缓存并设置较低的缓存保留时间。假设是 10 秒,这意味着在内容更新后,请求最多会过时 10 秒。我不知道laravel上的“过时和更新”方式,但它可以用队列来完成。
客户端缓存(无需数据传输):
正如我所说,客户端需要知道数据已更新以使缓存无效。
-
通常对于资产,我们通过向文件URL添加GET参数来执行“缓存突发”。例如,“资产版本=1234.env”。如果您有 CD/CI,则可以动态完成,或者可以在部署时触发精简。在这种情况下,您可以“无限”缓存这些,因为“刷新”将通过更改URL参数来完成。with version changing for each deployment. As header cache is URL (and header) based, URL change will force network loading of files. Not tested with text/HTML content-type response, but worth a try if you can update URLs with a parameter you can change in
-
您可以查看似乎工作相同的标头值:始终提供缓存,如果过期,则刷新缓存(也请查看其他参数,可以给您想法)。注意这方面的兼容性(没有IE或Safari)。stale-while-revalidate
Cache-Control
Laravel缓存可能是实现和测试最快的,看看结果是否适合您。这也取决于有效负载的大小,如果它很大,浏览器缓存确实更好。如果带宽不是问题,那主要是服务器响应时间:在这种情况下,Laravel Cache可以解决问题。