Урок 02

Драйверы кэша: 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*'

Правило: всегда проверять после смены драйвера.

Смена драйвера

Что делать:

  1. Поменять env.
  2. php artisan config:clear.
  3. php artisan cache:clear.
  4. Проверить через tinker.
  5. Прогнать 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.