Каталог товаров: 95% запросов — чтение, описания меняются редко, но изменение цены должно быть видно пользователям в течение минуты. Как вы спроектируете кэширование?
- Как спроектировать кэш для каталога товаров?
Разделить данные по требуемой свежести: картинки и статика — CDN с версионированными именами; описания — кэш на десятки минут; цена и остаток — отдельный ключ с коротким TTL и инвалидацией по событию.
- Не один TTL на всю карточку
- Защита от давки: разброс TTL, single flight
- План на падение кэша: база должна пережить часть нагрузки, ограничитель
А ещё Минута на цену — инвалидация по событию плюс TTL как страховка
Подробно
Ключевое проектное решение здесь — не выбирать один срок жизни на всю карточку, а разделить данные по требованию к свежести. Изображения и статика уходят на сеть доставки с версионированными именами и практически бесконечным сроком: инвалидация заменяется сменой имени файла. Описания, характеристики и категории меняются редко и живут в распределённом кэше десятками минут. Цена и остаток — отдельный ключ с временем жизни порядка десятков секунд и явной инвалидацией по событию изменения, чтобы уложиться в требуемую минуту; так дорогая свежесть покупается только для маленькой части данных. Обязательны разброс времени жизни, пересчёт популярных ключей в один поток и выдача устаревшего значения с фоновым обновлением, а для товаров с витрины — локальная копия в памяти инстанса перед распределённым кэшем, чтобы не создавать горячий ключ. Отдельно продумывается отказ кэша: при перезапуске Redis весь трафик уйдёт в базу, поэтому нужны ограничение числа одновременных обращений, предохранитель и постепенный прогрев. Успех измеряют долей попаданий по типам ключей, задержкой на верхнем перцентиле и нагрузкой на базу, а не общей средней цифрой.
Что хотят услышать
- Разделение по требованиям свежести.
- Конкретные уровни: CDN, общий кэш, короткий ключ цены.
- Защита от давки и план на отказ кэша.
Частые ошибки
- Кэшировать карточку целиком одним ключом и упереться в требование по свежести цены.
- Не предусмотреть поведение при холодном кэше и уронить базу при первом же перезапуске.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Разделить по свежести: статика в CDN, описания — долгий кэш, цена — короткий TTL и инвалидация по событию
- ✗Один TTL в минуту на всю карточку товара
- ✗Не кэшировать, раз цена меняется
- ✗Кэшировать всё на час и сбрасывать весь кэш целиком при любом изменении цены
Что спросят дальше
- Как обеспечить, чтобы изменение цены не потерялось при недоступности кэша?
- Почему для персонализированной выдачи такая схема работает хуже?
Разбор темы
- Кэширование и CDN
Кэш как размен согласованности на задержку, hit rate и слои, стратегии чтения и записи, инвалидация и гонка с записью, stampede и лавина, вытеснение и горячие ключи, CDN и ключ кэша.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.