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
Вы также можете попробовать
- кеширование конфигурации: php artisan config: кеш
- Маршрутное кэширование: php artisan route: cache
- и используя memcached, если вы можете.
Как уже говорилось, клиентскому браузеру нужен запрос, чтобы знать, что данные были обновлены. Вот несколько решений, которые я бы рассмотрел в вашем случае:
Кеш на стороне сервера (данные по-прежнему необходимо передавать по сети):
в зависимости от вашей среды, я бы настроил кеш Nginx + FastCGI, используя политику «устаревшие и обновленные». Таким образом, кеш всегда обслуживается (быстро), и кеш всегда обновляется. Таким образом, только несколько запросов (один или несколько в зависимости от времени обновления кеша) после обновления кода обслуживаются с устаревшими данными. Этот кеш основан на URL-адресах, поэтому, если ваш контент основан на файлах cookie/ сеансах, это может стать сложным.
как сказал @ZachRobichaud, вы можете использовать кеш Laravel и установить низкое время хранения кеша. Скажем, 10 секунд, что означает, что запрос будет устаревшим максимум на 10 секунд после обновления вашего контента. Я не знаю о способе «устаревшего и обновленного» в laravel, но это можно сделать с помощью очередей.
Кеш на стороне клиента (передача данных не требуется):
как я уже сказал, клиент должен знать, что данные были обновлены, чтобы сделать кеш недействительным.
Обычно для ресурсов мы выполняем «разрыв кеша», добавляя параметры GET к URL-адресу файла. Нравится 'asset? Version=1234
.env` в качестве примера. Может быть выполнено динамически, если у вас есть CD / CI или тонкие, которые вы можете запускать при развертывании. В этом случае вы можете «бесконечно» кэшировать их, так как «обновление» будет выполняться путем изменения параметра URL. Вы можете взглянуть на
значение заголовка, которое, похоже, работает одинаково: всегда обслуживать кеш и обновлять кеш, если срок его действия истек (также посмотрите другие параметры, могут дать вам идеи). Будьте осторожны с совместимостью (без IE или Safari).
Laravel Cache может быть самым быстрым для реализации и тестирования, и посмотрите, подходят ли вам результаты. Это также зависит от размера полезной нагрузки, если он огромен, кеш браузера действительно лучше. Если проблема не в пропускной способности, то в основном это время ответа сервера: в этом случае Laravel Cache сделает свое дело.