Гибкое кэширование в Laravel — это очень просто

Источник: «Flexible Caching in Laravel Made Super Easy»
Познакомьтесь с новым методом Cache::flexible() в Laravel, позволяющим сбалансировать свежесть данных и производительность в приложениях с высокой активностью.

Введение

В Laravel 11 появилась новая функция кэширования, призванная изменить подход к обработке дорогостоящих операций с данными. Новый метод Cache::flexible() реализует паттерн, позволяющий обслуживать кэшированные данные, обновляя их в фоновом режиме, предлагая разумное решение извечной проблемы баланса между свежестью данных и производительностью приложения. В статье мы рассмотрим эту функцию, начав с основ и постепенно погружаясь в более сложные сценарии использования.

Понимание двухуровневой системы TTL

Ключевое нововведение в Cache::flexible() — двухуровневая система TTL. Эта система определяет два важных временных периода:

  1. Период свежести: Как долго данные считаются актуальными.
  2. Период отсрочки: Как долго могут обслуживаться слегка устаревшие данные, пока происходит обновление в фоновом режиме.

Простой пример для наглядности:

use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;

$value = Cache::flexible(
key: 'my_data',
ttl: [
Carbon::minutes(5), // Период "свежести"
Carbon::minutes(15) // Общий жизненный цикл (свежесть + отсрочка)
],
callback: function () {
// Дорогостоящая операция.
}
);

В данном случае:

Эта двухуровневая система позволяет приложению:

  1. Предоставлять свежие данные большую часть времени.
  2. Поддерживать оперативность, даже если данные нуждаются в обновлении.
  3. Не допускать устаревания данных.

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

Применение в реальном мире: Рекомендации в интернет-торговле

Рассмотрим более практичный пример. Представьте, что есть сайт интернет-магазина и необходимо отображать персонализированные рекомендации по товарам:

use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;

$recommendations = Cache::flexible(
key: 'user_recommendations:' . $userId,
ttl: [
Carbon::minutes(5),
Carbon::minutes(15)
],
callback: function () use ($userId) {
return $this->recommendations->get($userId);
},
lock: ['seconds' => 10]
);

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

Продвинутый вариант использования: Панель аналитики

Для более сложных сценариев, таких как кэширование агрегированных аналитических данных для панели управления, можно использовать Cache::flexible(), чтобы сбалансировать свежесть данных и производительность системы:

use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;

$stats = Cache::flexible(
key: 'dashboard_stats',
ttl: [
Carbon::minute(),
Carbon::minutes(10)
],
callback: function () {
return [
'total_sales' => Order::sum('total'),
'new_users' => User::where('created_at', '>=', now()->subDay())->count(),
'popular_products' => Product::withCount('orders')
->orderByDesc('orders_count')
->limit(5)
->get()
];
}
);

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

Сценарии с высокой нагрузкой

В ситуациях с высокими нагрузками для предотвращения одновременных попыток нескольких процессов обновить кэш можно использовать конфигурацию блокировки:

use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;

Cache::flexible(
key: 'high_traffic_key',
ttl: [
Carbon::seconds(30),
Carbon::minute()
],
callback: function () {
// Сложные вычисления
},
lock: [
'seconds' => 5,
'owner' => 'custom_owner'
]
);

Эта блокировка гарантирует, что только один процесс пытается обновить кэш за один раз, предотвращая избыточную работу и потенциальные условия гонки.

Когда не следует использовать гибкое кэширование

Хотя Cache::flexible() — это мощный инструмент, он подходит не для всех типов данных. Критичная для безопасности информация, например токены аутентификации пользователей, не должна использовать этот метод кэширования, поскольку предоставление слегка устаревших данных может привести к уязвимостям в системе безопасности.

Заключение

Метод Cache::flexible() в Laravel 11 обеспечивает тонкий подход к кэшированию, способный значительно повысить производительность приложений во многих реальных сценариях. Позволяя контролировать использование слегка устаревших данных, он устанавливает баланс между свежестью данных и отзывчивостью системы.

При правильном использовании эта функция может привести к более отзывчивым приложениям и улучшению пользовательского опыта в целом.

Комментарии


Дополнительные материалы

Предыдущая Статья

Используйте useId() вместо вручную созданных ID

Следующая Статья

Авторизация маршрутов на основе политики в Laravel