Выбор ответа Senior Производительность: OPcache и FPM обновлено

Кеш и его инвалидация

Вопрос

Главная страница каталога строится 800 мс из-за тяжёлых запросов. Какой подход разумнее всего?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Redis с TTL, сброс по изменению товаров и защита от stampede. Общий кеш в Redis или Memcached доступен всем воркерам и серверам.

Варианты ответа

  1. Redis с TTL, сброс по изменению товаров и защита от stampedeправильный ответ
  2. Кешировать результат в статическую переменную PHP-класса каталога
  3. Кешировать в сессии каждого пользователя при первом заходе
  4. Не кешировать, а увеличить число воркеров pm.max_children

Разбор

Общий кеш в Redis или Memcached доступен всем воркерам и серверам. TTL ограничивает устаревание, а сброс по событию даёт свежесть. Без защиты при истечении ключа сотни запросов одновременно начнут пересчёт (cache stampede), поэтому используют блокировку (Cache::lock, Cache::flexible в Laravel 11+) или отдачу устаревшего значения на время пересчёта. Статическая переменная живёт один запрос в FPM, сессия дублирует данные на каждого пользователя.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.