Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 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
16

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

Коментарі

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

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

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

Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

9
CSRF і завантаження
Новини 09 жовтня 2026

Порада з безпеки: як завантаження файлів може обійти захист від CSRF

Стівен Ріс-Картер пояснює, чому файли користувачів варто віддавати з окремого домену: HTML і JS у межах основного застосунку дають доступ до cookie та CSRF-токенів.

18

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

Laravel Octane

laravel/octane

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

4,035 v2.19.1 13 6

Laravel Pulse

laravel/pulse

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

1,710 v1.8.0 13 3