Laravel 5.1 Объектно-ориентированное кэширование ответов ajax

Я работаю над проектом Laravel 5.1, использующим множество вызовов ajax, возвращающих блоки html.

Чтобы оптимизировать скорость работы сайта, я хочу внедрить частное и публичное кэширование ответов. это работает нормально, используя следующий код:

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

И все же, используя его таким образом, вы не сможете хранить объекты аккаунта, которые обновляются в течение 300 секунд.

Существуют ли возможности, позволяющие очистить кэш ответа на запрос, если и только если возвращаемые объекты были обновлены?

2 ответа

Может быть, вы можете попробовать кэширование на стороне сервера следующим образом. извини это грубо

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

Вы также можете попробовать

Как уже говорилось, клиентскому браузеру нужен запрос, чтобы знать, что данные были обновлены. Вот несколько решений, которые я бы рассмотрел в вашем случае:

Кеш на стороне сервера (данные по-прежнему необходимо передавать по сети):

  • в зависимости от вашей среды, я бы настроил кеш Nginx + FastCGI, используя политику «устаревшие и обновленные». Таким образом, кеш всегда обслуживается (быстро), и кеш всегда обновляется. Таким образом, только несколько запросов (один или несколько в зависимости от времени обновления кеша) после обновления кода обслуживаются с устаревшими данными. Этот кеш основан на URL-адресах, поэтому, если ваш контент основан на файлах cookie/ сеансах, это может стать сложным.

  • как сказал @ZachRobichaud, вы можете использовать кеш Laravel и установить низкое время хранения кеша. Скажем, 10 секунд, что означает, что запрос будет устаревшим максимум на 10 секунд после обновления вашего контента. Я не знаю о способе «устаревшего и обновленного» в laravel, но это можно сделать с помощью очередей.

Кеш на стороне клиента (передача данных не требуется):

как я уже сказал, клиент должен знать, что данные были обновлены, чтобы сделать кеш недействительным.

  • Обычно для ресурсов мы выполняем «разрыв кеша», добавляя параметры GET к URL-адресу файла. Нравится 'asset? Version=1234 .env` в качестве примера. Может быть выполнено динамически, если у вас есть CD / CI или тонкие, которые вы можете запускать при развертывании. В этом случае вы можете «бесконечно» кэшировать их, так как «обновление» будет выполняться путем изменения параметра URL.

  • Вы можете взглянуть на значение заголовка, которое, похоже, работает одинаково: всегда обслуживать кеш и обновлять кеш, если срок его действия истек (также посмотрите другие параметры, могут дать вам идеи). Будьте осторожны с совместимостью (без IE или Safari).

Laravel Cache может быть самым быстрым для реализации и тестирования, и посмотрите, подходят ли вам результаты. Это также зависит от размера полезной нагрузки, если он огромен, кеш браузера действительно лучше. Если проблема не в пропускной способности, то в основном это время ответа сервера: в этом случае Laravel Cache сделает свое дело.

Другие вопросы по тегам