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

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

MiddleКэширование и CDN
Ещё спрашивают так:
  • Как спроектировать кэш для каталога товаров?
Коротко

Разделить данные по требуемой свежести: картинки и статика — CDN с версионированными именами; описания — кэш на десятки минут; цена и остаток — отдельный ключ с коротким TTL и инвалидацией по событию.

  • Не один TTL на всю карточку
  • Защита от давки: разброс TTL, single flight
  • План на падение кэша: база должна пережить часть нагрузки, ограничитель

А ещё Минута на цену — инвалидация по событию плюс TTL как страховка

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

Подробно

Ключевое проектное решение здесь — не выбирать один срок жизни на всю карточку, а разделить данные по требованию к свежести. Изображения и статика уходят на сеть доставки с версионированными именами и практически бесконечным сроком: инвалидация заменяется сменой имени файла. Описания, характеристики и категории меняются редко и живут в распределённом кэше десятками минут. Цена и остаток — отдельный ключ с временем жизни порядка десятков секунд и явной инвалидацией по событию изменения, чтобы уложиться в требуемую минуту; так дорогая свежесть покупается только для маленькой части данных. Обязательны разброс времени жизни, пересчёт популярных ключей в один поток и выдача устаревшего значения с фоновым обновлением, а для товаров с витрины — локальная копия в памяти инстанса перед распределённым кэшем, чтобы не создавать горячий ключ. Отдельно продумывается отказ кэша: при перезапуске Redis весь трафик уйдёт в базу, поэтому нужны ограничение числа одновременных обращений, предохранитель и постепенный прогрев. Успех измеряют долей попаданий по типам ключей, задержкой на верхнем перцентиле и нагрузкой на базу, а не общей средней цифрой.

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

  • Разделение по требованиям свежести.
  • Конкретные уровни: CDN, общий кэш, короткий ключ цены.
  • Защита от давки и план на отказ кэша.

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

  • Кэшировать карточку целиком одним ключом и упереться в требование по свежести цены.
  • Не предусмотреть поведение при холодном кэше и уронить базу при первом же перезапуске.

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

  • Как обеспечить, чтобы изменение цены не потерялось при недоступности кэша?
  • Почему для персонализированной выдачи такая схема работает хуже?

Разбор темы

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

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

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

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

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