Получить доступ

Как оценить, насколько кэш разгружает базу, и что будет, если он упадёт?

MiddleКэши под нагрузкой
Ещё спрашивают так:
  • Что такое hit ratio и почему 90% и 99% — большая разница?
  • Что делать с холодным кэшем после перезапуска?
  • Как защититься от падения кэша?
Коротко

Нагрузка на базу = поток × доля промахов. Рост hit ratio с 90% до 99% снижает нагрузку на базу в 10 раз. Обратная сторона: если база рассчитана только на промахи, падение кэша — это авария.

  • Hit ratio зависит от размера кэша, распределения запросов (Ципф) и TTL
  • Холодный старт: после перезапуска все запросы — промахи; прогревать постепенно
  • Защита: база должна пережить хотя бы часть нагрузки без кэша, ограничители, деградация

А ещё Отрицательное кэширование: запоминать и «не найдено», иначе несуществующие ключи всегда бьют в базу

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

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

LRU-кэш: хеш-таблица плюс двусвязный список

Подробно

Арифметика. При потоке 50 000 RPS и hit ratio 90% в базу идёт 5 000 RPS, при 99% — 500, при 99,9% — 50. Последние девятки дают самый большой эффект на базу, но достаются всё дороже по памяти.

От чего зависит hit ratio:

  • распределение популярности — запросы к контенту обычно следуют закону Ципфа: небольшая доля ключей получает основную долю запросов. Поэтому кэш на 1–5% данных часто даёт 80–95% попаданий, а дальше рост медленный;
  • размер кэша относительно рабочего набора;
  • TTL — короткий TTL снижает попадания даже при достаточной памяти;
  • политика вытеснения и защита от сканирования;
  • ключи — разные ключи для одного и того же (параметры в разном порядке, лишние поля) дробят кэш.

Время ответа. Средняя задержка = hit × t_кэша + miss × t_базы. При кэше 1 мс и базе 20 мс: 90% → 2,9 мс, 99% → 1,2 мс.

Опасность зависимости от кэша. Со временем база начинает держать только промахи, и её «оптимизируют» под эту нагрузку. Если кэш упал или перезапустился пустым (холодный), в базу пойдёт в 10–100 раз больше запросов — и она ляжет, после чего не прогреть и кэш. Как защищаться:

  • база рассчитана хотя бы на заметную часть нагрузки без кэша, или перед ней ограничитель параллелизма (лучше отказать части, чем всем);
  • кэш с репликами и постоянством (Redis replica, Sentinel/Cluster), а не один экземпляр;
  • постепенный прогрев: снять дамп горячих ключей и загрузить, или пускать трафик на новый узел кэша порциями;
  • схлопывание запросов — при промахе по одному ключу в базу идёт один запрос, остальные ждут его;
  • двухуровневый кэш — локальный в памяти сервиса на секунды гасит горячие ключи даже при недоступном общем;
  • устаревшие данные при ошибке — отдать прошлое значение, если обновить не удалось (stale-if-error).

Отрицательное кэширование. Запросы к несуществующим ключам (опечатки, боты, атака перебором id) — всегда промахи. Кэшировать «не найдено» на короткое время или ставить фильтр Блума перед базой.

Метрики: hit ratio по типам ключей, задержка кэша и базы, вытеснения (evictions), память, число ключей; алерт на падение hit ratio — ранний сигнал проблем.

Пример

Поток 40 000 RPS, база выдерживает 6 000 RPS.
hit 95% → 2 000 RPS в базу — запас трёхкратный.
Кэш перезапустился пустым → 40 000 RPS в базу → отказ.
Решение: прогрев из дампа ключей + ограничитель 5 000 RPS к базе + локальный кэш на 5 с.

Что хотят услышать

  • Нагрузка на базу через долю промахов, эффект последних девяток.
  • От чего зависит hit ratio: распределение, размер, TTL, ключи.
  • Риск падения или холодного кэша и способы защиты.
  • Отрицательное кэширование — плюс.

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

  • Считать кэш «необязательной оптимизацией», когда база без него уже не справится.
  • Не кэшировать отсутствие данных.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем