我正在从事一个Laravel5.1项目,使用大量返回html块的ajax调用。
为了优化网站的速度,我想实现私人和公共响应缓存。
return response()
->json($result)
->header('Cache-Control', 'public, max-age=300');
然而,以这种方式使用它不会保存在300秒内更新的帐户对象中。
是否有可能允许我清除请求的响应缓存,当且仅当返回的对象已经更新?
也许您可以尝试使用下面这样的服务器端缓存。对不起,这太粗鲁了
function sometest(User $user)
{
/** . . .conditions to check if some data has changed . . . **/
$jsonResponse = Cache::remember(Auth::id() . "_sometest", 300, function () use ($user)
{
$result = $user->all(); //get result here
return $result;
});
return response()->json($jsonResponse);
}
您可以在这里阅读缓存
你也可以试试
如其他所述,客户端浏览器需要一个请求来知道数据已经被更新。在你的情况下,我会考虑以下一些解决方案:
服务器端缓存(数据仍然需要网络传输):
>
根据您的环境,我将使用过时和更新策略设置Nginx FastCGI缓存。所以缓存总是服务(快速),缓存总是刷新。因此,在代码更新后,只有少数请求(一个或多个,取决于刷新缓存的时间)被提供过时的数据。此缓存是基于URL的,所以如果您的内容是基于cookie/会话的,它可能会变得棘手。
正如@ZachRobichaud所说,您可以使用Laravel缓存并设置较低的缓存保留时间。比如说10秒,这意味着在您的内容更新后,请求将过期最多10秒。我不知道在laravel上有一种“过时且更新”的方式,但它可以通过队列来完成。
客户端缓存(无需数据传输):
如我所说,客户端需要知道数据已被更新以使缓存无效。
>
通常,对于资产,我们通过向文件URL添加GET参数来进行“缓存爆破”。比如“资产”?版本=1234,每次部署都会更改版本。由于标头缓存基于URL(和标头),URL更改将强制网络加载文件。未使用text/HTML内容类型响应进行测试,但如果您可以使用可以在
中更改的参数更新URL,则值得一试。以env`为例。如果您有CD/CI或其他可在部署时触发的内容,则可以动态执行。在这种情况下,您可以“无限”缓存这些内容,因为“刷新”将通过更改URL参数来完成。
您可以查看stale while revalidate
缓存控制
标题值,该值似乎工作相同:始终为缓存提供服务,如果缓存过期,则刷新缓存(还可以查看其他参数,可以为您提供一些想法)。注意兼容性(没有IE或Safari)。
Laravel缓存可能是实现和测试最快的,看看结果是否适合您。这还取决于负载大小,如果负载很大,浏览器缓存确实更好。如果带宽不是问题,主要是服务器响应时间:在这种情况下,Laravel缓存就可以解决这个问题。