Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 26 вересня 2026

Мемоізація читання тегованого кешу в Laravel

Мемоізований кеш Laravel, Cache::memo(), зчитує ключ із вашого кеш-сховища один раз і обслуговує його з пам'яті протягом решти запиту або задачі. Починаючи з Laravel 13.33, він також працює з тегами кешу, тому тепер можна мемоізувати теговані значення за допомогою Cache::memo()->tags().

Це особливо корисно, коли один запит багато разів зчитує одне й те саме теговане значення. Наприклад, перевірка прав доступу може виконуватися для кожного виклику can() і кожної директиви @can у представленні. Без мемоізації кожна така операція знову звертається до кеш-сховища.

Мемоізація тегованого пошуку

Викличте метод tags() на мемоізованому кеші й використовуйте його як будь-який інший тегований кеш:

use Illuminate\Support\Facades\Cache;

public function getPermissions(User $user): Collection
{
    return Cache::memo()
        ->tags(['permissions', "user:{$user->id}"])
        ->remember(
            "permissions:{$user->id}",
            now()->addHour(),
            fn () => $this->loadPermissionsFromDatabase($user)
        );
}

Перший виклик у запиті зчитує дані з кеш-сховища або виконує замикання у разі промаху кешу. Наступні виклики з тими самими тегами та ключем повертають значення безпосередньо з пам'яті.

До того, як мемоізований кеш отримав підтримку тегів, розробникам доводилося обгортати тегований кеш у сховище array власноруч:

return Cache::store('array')->tags('permission_cache')->rememberForever($cacheKey,
    fn () => Cache::tags($this->cacheTags($user))->remember(
        $cacheKey,
        config('auth.permissions.default_cache_time'),
        fn () => $this->loadPermissionsFromDatabase($user)
    )
);

Запис і очищення

Методи, які змінюють значення, записують дані до тегованого кешу та видаляють мемоізовану копію цього ключа. Тому наступне зчитування знову звертається до сховища:

$cache = Cache::memo()->tags(['permissions']);

$cache->get('permissions:1');           // Зчитує з кеш-сховища
$cache->get('permissions:1');           // Зчитує з пам'яті
$cache->put('permissions:1', $updated); // Записує у сховище, забуває мемоізоване значення
$cache->get('permissions:1');           // Знову зчитує з кеш-сховища

Це стосується методів put(), putMany(), add(), increment(), decrement(), forever(), touch() та forget(). Виклик flush() на мемоізованому тегованому кеші очищує теги у сховищі та прибирає мемоізовані теговані значення.

Коли використовувати

Мемоізований кеш зберігає те, що поточний запит уже зчитав. Якщо обробник черги або інший запит змінить значення, поточний запит цієї зміни не побачить.

Цей підхід варто застосовувати для значень, які не змінюються протягом запиту, наприклад прав доступу або налаштувань. Лічильники та будь-які дані, які інший процес оновлює під час запиту, краще залишити в звичайному кеші.

Мемоізовані значення скидаються на початку кожного запиту або задачі, тому тривалі воркери не зберігають застарілі дані між завданнями.

Додаткові матеріали

  • Реліз Laravel 13.33, який додав підтримку tags()
  • Laravel 12.9, де вперше з'явився Cache::memo()
  • Інтерактивний пошук і видалення ключів кешу в Laravel за допомогою Cache UI
  • Документація Laravel про мемоізацію кешу
  • Pull request #61593 від Joost de Bruijn
0

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

JetBrains Air
Новини 26 вересня 2026

JetBrains Air: запуск AI-агентів у середовищі розробки JetBrains

JetBrains представила JetBrains Air - екосистему продуктів для роботи з AI-агентами в IDE. Система включає безкоштовний плагін для PhpStorm, хмарну платформу для команд та інструменти управління для організацій, підтримуючи агентів від різних провайдерів.

10
Eloquent Refreshes
Новини 25 вересня 2026

Eloquent Refreshes: автоматичне завантаження згенерованих колонок після збереження

Laravel 13.33 представив атрибут #[Refreshes], який автоматично завантажує значення колонок, обчислених базою даних, одразу після створення або оновлення моделі - без необхідності вручну викликати refresh().

8

Пакети за темою

Laravel Octane

laravel/octane

Прискорює застосунок, тримаючи його в пам'яті між запитами через FrankenPHP, Swoole або RoadRunner. Прибирає завантаження фреймворку з кожного запиту, даючи кратний приріст пропускної здатності.

4,035 v2.19.1 13 5

Laravel Pulse

laravel/pulse

Дашборд продуктивності застосунку в реальному часі: повільні запити й джоби, навантаження на сервери, використання кешу, найактивніші користувачі. Легка альтернатива зовнішнім APM-сервісам.

1,710 v1.8.0 13 3