---
title: "Мемоізація читання тегованого кешу в Laravel"
url: https://laravelukraine.com/blog/memoizaciia-citannia-tegovanogo-kesu-v-laravel
date: 2026-09-26
source: https://laravel-news.com/laravel-tagged-memoized-cache
---

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

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

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

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

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

```php
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` власноруч:

```php
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)
    )
);
```

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

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

```php
$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
