Найскладніше в кешуванні - не покласти значення, а вчасно його прибрати. Є три основні підходи.
1. Явне видалення при зміні:
class Category extends Model
{
protected static function booted(): void
{
static::saved(fn () => Cache::forget('categories:menu'));
static::deleted(fn () => Cache::forget('categories:menu'));
}
}
Просто, але треба пам'ятати всі ключі, які залежать від моделі. Масові оновлення Category::query()->update() подій моделі не викликають - кеш лишиться старим.
2. Теги - скинути групу ключів однією командою:
Cache::tags(['posts', 'user:42'])->remember('user:42:posts', 3600, fn () => /* ... */);
Cache::tags('posts')->flush(); // усе, що стосується постів
Працює лише з драйверами, що підтримують теги (Redis, Memcached), - не з file і database.
3. Версія в ключі - нічого не видаляти, а змінювати ключ:
$version = Cache::rememberForever('posts:version', fn () => 1);
$posts = Cache::remember("posts:v{$version}:page:{$page}", 3600, fn () => /* ... */);
// при зміні
Cache::increment('posts:version');
Старі ключі просто перестають читатися й самі зникають за TTL. Працює з будь-яким драйвером.
Правило: короткий TTL - страховка на випадок, якщо скидання десь забули. Довгий TTL без надійного скидання - гарантовані скарги на застарілі дані.