Введение в кэширование
Что такое кэш
Кэш — быстрое хранилище для результатов, которые дорого получать заново.
Идея:
- Посчитали один раз.
- Сохранили рядом.
- Отдаём из кэша.
- Инвалидируем, когда данные изменились.
Правило: кэш — самое дешёвое ускорение.
Зачем кэшировать
Что даёт:
- Быстрее ответы (мс вместо сек).
- Меньше нагрузки на БД.
- Меньше нагрузки на 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 по шагам
Схема:
- GET из кэша.
- Есть → отдаём.
- Нет → считаем из БД.
- PUT в кэш с TTL.
- Отдаём результат.
В 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.