14

我正在开发一个 Laravel 5.1 项目,使用大量返回 html 块的 ajax 调用。

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

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

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

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

4

2 回答 2

0

正如其他人所说,客户端浏览器需要一个请求才能知道数据已经更新。以下是我会针对您的情况研究的一些解决方案:

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

  • 根据您的环境,我会使用“陈旧和更新”策略设置 Nginx + FastCGI 缓存。所以缓存总是被服务(快速),并且缓存总是被刷新。因此,在代码更新后,只有少数请求(一个或多个,取决于刷新缓存的时间)使用过时的数据。这个缓存是基于 URL 的,所以如果你的内容是基于 cookie/session 的,它会变得很棘手。

  • 正如@ZachRobichaud 所说,您可以使用 Laravel 缓存并设置较低的缓存保留时间。比方说 10 秒,这意味着在您的内容更新后请求将过时最多 10 秒。我不知道 laravel 上的“陈旧和更新”方式,但可以通过队列来完成。

客户端缓存(无需数据传输):

正如我所说,客户端需要知道数据已更新以使缓存无效。

  • 通常对于资产,我们通过将 GET 参数添加到文件 URL 来进行“缓存突发”。像 'asset?version=1234 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.env` 作为例子。如果您有 CD/CI 或可以在部署时触发的精简,则可以动态完成。在这种情况下,您可以“无限”缓存这些内容,因为“刷新”将通过更改 URL 参数来完成。

  • 您可以查看 stale-while-revalidate Cache-Control似乎工作相同的标头值:始终提供缓存,如果过期则刷新缓存(还可以查看其他参数,可以给您一些想法)。注意兼容性(没有 IE 或 Safari)。

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

于 2021-10-25T22:53:49.763 回答
0

也许您可以尝试使用下面这样的服务器端缓存。抱歉,这很粗糙

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

你可以在这里阅读缓存

你也可以试试

于 2016-04-21T15:35:00.227 回答