Laravel 5.1 面向对象的ajax响应缓存

2022-08-30 23:47:48

我正在开发一个Laravel 5.1项目,使用了很多ajax调用返回html块。

为了优化网站的速度,我想实现私有和公共响应缓存。这使用以下代码工作正常:

        return response()
        ->json($result)
        ->header('Cache-Control', 'public, max-age=300');

然而,以这种方式使用它不会保留在300秒内更新的帐户对象中。

当且仅当返回的对象已更新时,是否有可能允许我清除请求的响应缓存?


答案 1

也许你可以尝试使用下面这样的东西进行服务器端缓存。对不起,这是粗陋的

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);
}

你可以在这里阅读关于缓存

您也可以尝试


答案 2

如前所述,客户端浏览器需要一个请求来知道数据已经更新。以下是我会在您的案例中研究的一些解决方案:

服务器端缓存(数据仍需要网络传输):

  • 根据您的环境,我会使用“过时和更新”策略设置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-revalidateCache-Control

Laravel缓存可能是实现和测试最快的,看看结果是否适合您。这也取决于有效负载的大小,如果它很大,浏览器缓存确实更好。如果带宽不是问题,那主要是服务器响应时间:在这种情况下,Laravel Cache可以解决问题。


推荐