【问题标题】:Laravel 5.1 Object oriented ajax response cachingLaravel 5.1 面向对象的 ajax 响应缓存
【发布时间】:2016-07-08 03:29:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 要知道它们已更新,您必须发送实际请求。除非您在更新值时创建某种触发器,告诉缓存不应再使用它
  • 是的,我可以使用带有更新状态的 md5 散列的电子标签。但我想把它作为最后的手段,同时寻找一种优雅的方式。
  • 我通常使用 Redis 之类的东西在服务器端处理它。您可以在模型上放置一个观察者,然后遍历具有您的块的任何键并删除它们,以便在下一页加载时创建一个新的缓存版本。 (它们是特定于用户或页面,还是两者兼而有之?
  • 你也许可以利用 localcache blogs.tensult.com/2020/01/27/…

标签: php laravel httpresponsecache


【解决方案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);
}

你可以在这里阅读Cache

你也可以试试

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    • 通常对于资产,我们通过将 GET 参数添加到文件 URL 来执行“缓存突发”。像 'asset?version=1234with 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 参数来完成。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-08
      • 2014-01-07
      • 2015-10-30
      • 2016-02-24
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多