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

Зачем нужно кэширование и какие у него главные риски?

JuniorКэширование и CDN
Ещё спрашивают так:
  • Что такое cache-aside?
  • Где можно кэшировать данные?
Коротко

Кэш хранит результат дорогой операции ближе к потребителю: меньше задержка и нагрузка на источник. Главные риски — устаревшие данные и зависимость от кэша.

  • Уровни: браузер, CDN, локальная память сервиса, Redis/Memcached, кэш базы
  • Cache-aside: читаем кэш, при промахе — базу и кладём в кэш; при записи — удаляем ключ
  • Инвалидация: TTL, удаление при записи, события об изменениях

А ещё Ещё риски: давка при истечении популярного ключа, холодный старт, рост памяти

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

Подробно

Зачем. Многие данные читают намного чаще, чем меняют. Ответ из памяти — микросекунды, из базы — миллисекунды, из внешнего сервиса — десятки. Кэш снижает задержку и разгружает источник: при доле попаданий 95% в базу идёт двадцатая часть запросов.

Где кэшируют: в браузере (Cache-Control), на CDN, в памяти экземпляра (быстро, но у каждого экземпляра своя копия), в общем кэше (Redis), в самой базе (буферный кэш).

Шаблоны:

  • cache-aside (самый частый): приложение читает кэш; при промахе идёт в базу и кладёт результат с TTL; при изменении данных пишет в базу и удаляет ключ;
  • read-through / write-through — кэш сам ходит в источник или пишет в него;
  • write-back — запись сначала в кэш, в базу позже: быстро, но риск потери.

Риски:

  • устаревание — между изменением в базе и обновлением кэша пользователи видят старое. TTL ограничивает окно, удаление при записи сокращает;
  • гонки при одновременном чтении и записи оставляют в кэше старое значение надолго;
  • давка — популярный ключ истёк, и сотни запросов разом идут в базу;
  • зависимость — база перестаёт выдерживать нагрузку без кэша, и его падение превращается в аварию;
  • память — без лимита и политики вытеснения кэш растёт.

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

  • Зачем кэш: задержка и нагрузка, асимметрия чтения и записи.
  • Уровни кэширования.
  • Cache-aside: чтение и запись с удалением ключа.
  • Риски: устаревание, давка, зависимость от кэша.

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

  • Обновлять значение в кэше при записи вместо удаления — гонки оставляют старое.
  • Кэшировать без TTL и лимита памяти.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Заменяет базу данных полностью и упрощает архитектуру без побочных эффектов
  • ✓Снижает latency и нагрузку на источник; главные риски — устаревшие данные (нужна инвалидизация), cache stampede по горячему ключу и потеря данных при write-back
  • ✗Ускоряет запись на диск, но не влияет на чтение
  • ✗Делает систему строго согласованной за счёт TTL

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

  • Что такое cache-aside?
  • Как бороться с thundering herd?

Разбор темы

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

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

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

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

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