Redis у Laravel часто виконує одразу кілька ролей:
| Роль | Конфігурація | Що станеться, якщо дані зникнуть |
|---|---|---|
| кеш | CACHE_STORE=redis |
нічого страшного - перерахується |
| черги | QUEUE_CONNECTION=redis |
втрачено задачі: листи не підуть, оплати не обробляться |
| сесії | SESSION_DRIVER=redis |
користувачів розлогінить |
| блокування | Cache::lock, withoutOverlapping, ShouldBeUnique |
дублювання задач на короткий час |
| обмеження частоти | RateLimiter |
ліміти скинуться |
| Horizon, Pulse, broadcasting | метрики, pub/sub | залежить від ролі |
Проблема спільного Redis - різна цінність даних. Кеш можна втратити, черги - ні. А налаштування в Redis одне на весь екземпляр.
Витіснення при нестачі пам'яті (maxmemory-policy):
- для кешу логічна
allkeys-lru- видаляти найстаріші ключі; - але ця політика видаляє будь-які ключі, включно з задачами в черзі й сесіями. Під навантаженням, коли кеш заповнив пам'ять, Redis тихо видаляє задачі;
- для черг потрібна
noeviction- тоді при нестачі пам'яті Redis відмовляє в записі, і помилку видно.
cache:clear очищує всю базу Redis (FLUSHDB), яку використовує кеш. Якщо кеш і черги в одній базі, скидання кешу при деплої видаляє черги.
Тому Laravel за замовчуванням розділяє з'єднання в config/database.php:
'redis' => [
'default' => [..., 'database' => env('REDIS_DB', '0')], // черги, сесії
'cache' => [..., 'database' => env('REDIS_CACHE_DB', '1')], // кеш
],
Окремі номери баз захищають від FLUSHDB, але не від витіснення - політика пам'яті спільна для екземпляра.
Надійне розділення на продакшені:
- окремі екземпляри Redis для кешу (з
allkeys-lruі лімітом пам'яті) і для черг та сесій (noeviction, збереження на диск через AOF); - з'єднання для черги:
REDIS_QUEUE_CONNECTION, для сесій -SESSION_CONNECTION, для блокувань кешу -REDIS_CACHE_LOCK_CONNECTION; - моніторинг пам'яті (
INFO memory,used_memory,evicted_keys) - зростанняevicted_keysсигналізує, що кеш тисне на ліміт.
Ще одна пастка: один «сусідній» застосунок на тому самому Redis може заповнити пам'ять і зламати всіх. Спільний Redis для кількох проєктів без лімітів і окремих екземплярів - поширена причина аварій.