Драйверы кэша: file, database, redis, memcached
Где настраивается
config/cache.php:
'default' => env('CACHE_STORE', 'database'),
.env:
CACHE_STORE=redis
Правило: не хардкодить драйвер, менять через env.
Список драйверов
В Laravel 11+:
- array — в памяти запроса.
- file — файлы.
- database — таблица.
- redis — Redis.
- memcached — Memcached.
- dynamodb — AWS.
- octane — для Octane.
- null — заглушка.
Правило: в проде — redis или memcached.
Array
Что это: кэш в памяти текущего запроса.
Когда:
- Тесты.
- Локальные скрипты.
- Внутри одного запроса.
Не для:
- Прода.
- Между запросами.
Правило: array — для тестов.
File
Что это: кэш в storage/framework/cache/data/.
Плюсы:
- Без доп. сервисов.
- Работает из коробки.
- Dev — удобно.
Минусы:
- Медленно на I/O.
- Проблемы с правами.
- Не масштабируется между серверами.
- Файлов много.
Когда:
- Локальная разработка.
- Небольшие проекты.
Правило: file — только dev.
File: где лежит
config/cache.php:
'stores' => [
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
'lock_path' => storage_path('framework/cache/data'),
],
],
Что важно:
- Симлинки на шаренных хостингах ломают.
- Права
www-data. - Место на диске.
Database
Что это: таблица cache в БД.
Миграция:
php artisan cache:table
php artisan migrate
Структура:
CREATE TABLE cache (
key VARCHAR(255) PRIMARY KEY,
value MEDIUMTEXT,
expiration INTEGER
);
Плюсы:
- Без Redis/Memcached.
- Работает при одном сервере.
Минусы:
- Та же БД — нагрузка.
- Медленнее Redis.
- Не масштабируется.
Когда:
- Нет Redis.
- Маленькая нагрузка.
Правило: database — лучше, чем file, но хуже, чем redis.
Redis
Что это: in-memory key-value.
Плюсы:
- Быстро (мкс).
- Много структур (list, set, hash).
- TTL — из коробки.
- Pub/Sub, Streams.
- Масштабируется.
Минусы:
- Отдельный сервис.
- Память ограничена.
- Persistence нюансы.
Когда: всегда в проде.
Redis: установка
Ubuntu:
sudo apt install redis-server
sudo systemctl enable redis-server
Проверка:
redis-cli ping
# PONG
Redis: подключение
config/database.php:
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],
],
Что важно: отдельная БД для кэша.
Правило: cache на DB 1, sessions на 2, queues на 3.
Redis: клиент
phpredis (расширение):
sudo apt install php8.5-redis
predis (пакет):
composer require predis/predis
Правило: phpredis быстрее, predis проще ставить.
Redis: конфиг
config/cache.php:
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
'lock_connection' => 'default',
],
Что важно: для locks — отдельное соединение.
Memcached
Что это: распределённый in-memory кэш.
Плюсы:
- Много серверов.
- Просто.
- Быстро.
Минусы:
- Только key-value.
- Нет persistence.
- Нет сложных структур.
Когда: классические веб-приложения.
Правило: устаревает, чаще выбирают Redis.
Memcached: установка
Сервер:
sudo apt install memcached
PHP-расширение:
sudo apt install php8.5-memcached
Конфиг:
'memcached' => [
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
'options' => [],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
Сравнение
| Драйвер | Скорость | Масштаб | Прод | Сложные данные |
|---|---|---|---|---|
| array | Мкс | Нет | Нет | Да |
| file | Мс | Нет | Нет | Нет |
| database | Мс | Нет | Иногда | Нет |
| redis | Мкс | Да | Да | Да |
| memcached | Мкс | Да | Да | Нет |
Правило:
- Dev — file.
- Prod — redis.
- Legacy — memcached.
- Мини — database.
Правила выбора
Выбирай redis, если:
- Продукт в проде.
- Несколько серверов.
- Нужны tags, locks, pub/sub.
- Нужен Horizon, Session, Queue.
Выбирай database, если:
- Один сервер.
- Нет Redis.
- Мало трафика.
Выбирай file, если:
- Dev.
- Нет выбора.
Правило: в 2026 Redis — стандарт.
Одно хранилище для всего
Что можно на Redis:
- cache — DB 1.
- sessions — DB 2.
- queues — DB 3.
- horizon — DB 4.
- locks — DB 5.
Правило: разделять по DB — мониторить проще.
Проверка драйвера
Tinker:
php artisan tinker
>>> Cache::getStore();
>>> Cache::put('test', 123, 60);
>>> Cache::get('test');
Для Redis:
redis-cli -n 1 keys '*test*'
Правило: всегда проверять после смены драйвера.
Смена драйвера
Что делать:
- Поменять env.
php artisan config:clear.php artisan cache:clear.- Проверить через tinker.
- Прогнать smoke-тесты.
Правило: без config:clear изменения не применятся.
Сериализация
Что хранится: сериализованные значения.
Что важно:
- Eloquent-модели — ок.
- Closures — нет.
- Ресурсы — нет.
- Объекты — через
Serializable.
Правило: хранить примитивы и массивы, не объекты.
Практика
1. Установите Redis.
2. Поставьте phpredis.
3. Настройте соединения: default, cache, sessions, queue.
4. Смените CACHE_STORE=redis.
5. config:clear + cache:clear.
6. Проверьте Cache::getStore().
7. Замерьте скорость: Cache::get vs file.
8. Установите Memcached для сравнения.
9. Настройте разные DB для cache/sessions/queue.
10. Проверьте через redis-cli.
Частые ошибки
1. File в проде:
Медленно, проблемы
Решение: redis.
2. Одна БД Redis для всего:
Не отладить, не сбросить
Решение: разные DB.
3. Redis без пароля:
Уязвимость
Решение: requirepass.
4. Публичный порт 6379:
Взлом
Решение: bind localhost.
5. Predis вместо phpredis:
Медленнее
Решение: phpredis.
6. Забыли config:clear:
Старый драйвер
Решение: очистить.
7. Кэш без maxmemory:
OOM
Решение: maxmemory-policy allkeys-lru.
8. Redis без persistence:
Потеря при ребуте
Решение: RDB + AOF.
Итог
- array — для тестов.
- file — только dev.
- database — мини-прод.
- redis — стандарт.
- memcached — legacy.
- Отдельные БД для cache/sessions/queue.
- phpredis быстрее.
- maxmemory — настроить.
- config:clear — после смены.
- Проверять через tinker и
redis-cli.
Дальше — конфиг и кэш роутов: config:cache, route:cache.