Урок 01

Введение в кэширование

Что такое кэш

Кэш — быстрое хранилище для результатов, которые дорого получать заново.

Идея:

  • Посчитали один раз.
  • Сохранили рядом.
  • Отдаём из кэша.
  • Инвалидируем, когда данные изменились.

Правило: кэш — самое дешёвое ускорение.

Зачем кэшировать

Что даёт:

  • Быстрее ответы (мс вместо сек).
  • Меньше нагрузки на БД.
  • Меньше нагрузки на CPU.
  • Дешевле инфраструктура.
  • Лучше UX и SEO.

Что стоит:

  • Сложность логики.
  • Риск устаревших данных.
  • Память под хранение.
  • Инвалидация — самое сложное.

Правило: кэш не бесплатный — но почти всегда окупается.

Три уровня кэша

1. Уровень данных:

  • SQL-запрос — Cache::remember.
  • Модель — сериализованный объект.
  • Агрегат — сумма, счётчик.

2. Уровень страницы:

  • Response Cache — весь HTML.
  • Фрагменты Blade — @cache.
  • API-ответы — Cache-Control.

3. Уровень инфраструктуры:

  • OPcache — байт-код PHP.
  • CDN — статика.
  • Nginx proxy_cache — прокси.

Правило: кэшировать сверху вниз — от страницы к данным.

Что кэшировать

Хорошо кэшируется:

  • Справочники (категории, теги).
  • Топ-N (популярное, свежее).
  • Агрегаты (счётчики, суммы).
  • Тяжёлые отчёты.
  • Внешние API.
  • Статика и рендер.

Плохо кэшируется:

  • Личный кабинет.
  • Корзина.
  • Данные, меняющиеся каждую секунду.
  • Уникальные выборки.

Правило: кэшируй повторяемое, не уникальное.

Метрика: hit rate

Что это: % запросов, попавших в кэш.

Цели:

  • < 50% — плохо, кэш не работает.
  • 70–90% — хорошо.
  • > 90% — отлично.

Правило: hit rate — главная метрика кэша.

TTL

Time To Live — сколько живёт запись.

Значения:

  • 60 сек — часто меняется.
  • 1 час — справочники.
  • 1 день — статика.
  • 1 неделя — редко меняется.

Правило: короткий TTL + инвалидация лучше, чем долгий без неё.

Инвалидация

Когда сбрасывать:

  • Изменение сущности.
  • Публикация новой версии.
  • Ручная очистка.
  • TTL истёк.

Правило: если не можешь надёжно инвалидировать — не кэшируй.

Три стратегии

1. Cache-aside:

  • Читаем кэш.
  • Нет — считаем, кладём.

Что даёт: просто, надёжно.

2. Write-through:

  • Пишем в БД.
  • Пишем в кэш.

Что даёт: кэш всегда свежий.

3. Write-behind:

  • Пишем в кэш.
  • Позже синхронизируем.

Что даёт: быстро, но риск потери.

Правило: в Laravel — Cache-aside по умолчанию.

Cache-aside по шагам

Схема:

  1. GET из кэша.
  2. Есть → отдаём.
  3. Нет → считаем из БД.
  4. PUT в кэш с TTL.
  5. Отдаём результат.

В Laravel:

$value = Cache::remember('key', 3600, function () {
    return DB::table('stats')->sum('value');
});

Правило: remember() — 90% сценариев.

Драйверы кэша

Доступные:

  • file — файлы (по умолчанию в Laravel).
  • database — таблица.
  • redis — лучший для прода.
  • memcached — альтернатива.
  • array — только в рамках запроса.
  • dynamodb — AWS.
  • octane — для Octane.

Правило: dev — file, prod — redis.

Где кэш вредит

Примеры:

  • Персональные данные под общим ключом.
  • Финансовые операции без инвалидации.
  • Долгий TTL на живое.
  • Секреты в общем кэше.

Правило: ошибка в кэше = деньги и репутация.

Что важно в 2026

  • Redis — де-факто стандарт.
  • Octane — кэш через Swoole.
  • Laravel Pulse — hit rate в UI.
  • Response Cache — встроен в Laravel.
  • HTTP-кэш — Cache-Control.
  • CDN — для статики.

С чего начать

Чек-лист:

  • Включить Redis.
  • Поменять драйвер на redis.
  • Найти 3 тяжёлых запроса.
  • Обернуть в Cache::remember.
  • Замерить hit rate.
  • Настроить инвалидацию.
  • Проверить через Pulse.

Практика

1. Проверьте config/cache.php.

2. Какой драйвер сейчас?

3. Установите Redis, если нет.

4. Смените драйвер на redis.

5. Найдите топ-3 тяжёлых запроса.

6. Оберните в Cache::remember.

7. Замерьте до/после.

8. Откройте Pulse — hit rate.

Частые ошибки

1. Кэш без TTL:

Вечно устаревшие

Решение: всегда TTL.

2. Кэш без инвалидации:

Устаревшие данные

Решение: слушатели на события.

3. Кэш персонального по общему ключу:

Чужие данные

Решение: user_id в ключе.

4. Долгий TTL на живое:

Пользователь не видит своё

Решение: TTL короче.

5. Кэшировать всё:

Сложно, hit rate падает

Решение: только тяжёлое и повторяемое.

6. Нет метрик:

Не видно эффекта

Решение: Pulse / Telescope.

7. dev=file, prod=file:

Медленно

Решение: redis в проде.

8. Кэш вместо БД:

Потеря данных

Решение: кэш — вторичен.

Итог

  • Кэш — быстрое хранилище.
  • 3 уровня: данные, страница, инфра.
  • Cache-aside — основная стратегия.
  • remember() — главный метод.
  • TTL + инвалидация — обязательно.
  • Hit rate — метрика.
  • Redis — для прода.
  • file — только для dev.
  • Кэшировать повторяемое, не уникальное.
  • Ошибка в кэше — дорогая.

Дальше — драйверы кэша: file, database, redis, memcached.