Зачем нужно кэширование и какие у него главные риски?
- Что такое cache-aside?
- Где можно кэшировать данные?
Кэш хранит результат дорогой операции ближе к потребителю: меньше задержка и нагрузка на источник. Главные риски — устаревшие данные и зависимость от кэша.
- Уровни: браузер, CDN, локальная память сервиса, Redis/Memcached, кэш базы
- Cache-aside: читаем кэш, при промахе — базу и кладём в кэш; при записи — удаляем ключ
- Инвалидация: TTL, удаление при записи, события об изменениях
А ещё Ещё риски: давка при истечении популярного ключа, холодный старт, рост памяти
Подробно
Зачем. Многие данные читают намного чаще, чем меняют. Ответ из памяти — микросекунды, из базы — миллисекунды, из внешнего сервиса — десятки. Кэш снижает задержку и разгружает источник: при доле попаданий 95% в базу идёт двадцатая часть запросов.
Где кэшируют: в браузере (Cache-Control), на CDN, в памяти экземпляра (быстро, но у каждого экземпляра своя копия), в общем кэше (Redis), в самой базе (буферный кэш).
Шаблоны:
- cache-aside (самый частый): приложение читает кэш; при промахе идёт в базу и кладёт результат с TTL; при изменении данных пишет в базу и удаляет ключ;
- read-through / write-through — кэш сам ходит в источник или пишет в него;
- write-back — запись сначала в кэш, в базу позже: быстро, но риск потери.
Риски:
- устаревание — между изменением в базе и обновлением кэша пользователи видят старое. TTL ограничивает окно, удаление при записи сокращает;
- гонки при одновременном чтении и записи оставляют в кэше старое значение надолго;
- давка — популярный ключ истёк, и сотни запросов разом идут в базу;
- зависимость — база перестаёт выдерживать нагрузку без кэша, и его падение превращается в аварию;
- память — без лимита и политики вытеснения кэш растёт.
Что хотят услышать
- Зачем кэш: задержка и нагрузка, асимметрия чтения и записи.
- Уровни кэширования.
- Cache-aside: чтение и запись с удалением ключа.
- Риски: устаревание, давка, зависимость от кэша.
Частые ошибки
- Обновлять значение в кэше при записи вместо удаления — гонки оставляют старое.
- Кэшировать без TTL и лимита памяти.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Заменяет базу данных полностью и упрощает архитектуру без побочных эффектов
- ✗Ускоряет запись на диск, но не влияет на скорость чтения
- ✓Снижает задержку и нагрузку на источник; риски — устаревшие данные, stampede, потеря при write-back
- ✗Делает систему строго согласованной за счёт TTL, поэтому рисков почти нет
Что спросят дальше
- Что такое cache-aside?
- Как бороться с thundering herd?
Разбор темы
- Кэширование и CDN
Кэш как размен согласованности на задержку, hit rate и слои, стратегии чтения и записи, инвалидация и гонка с записью, stampede и лавина, вытеснение и горячие ключи, CDN и ключ кэша.
Связанные вопросы
- Чем write-through отличается от write-back при кэшировании записи? Middle
- Почему инвалидацию кэша считают одной из самых сложных задач и что помогает на практике? Middle
- Как оценить, насколько кэш разгружает базу, и что будет, если он упадёт? Middle
- Как устроен LRU-кэш и какие ещё бывают политики вытеснения? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.