Ответ вслух Senior Кеширование обновлено

Горячий ключ в Redis

Вопрос

В распродажу один товар даёт 200 000 чтений в секунду, и узел Redis кластера с этим ключом перегружен. Что будете делать?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала подтверждаю диагноз: нагрузка на один узел кластера, по метрикам видно ключ. Самое эффективное: локальный кеш в каждом экземпляре приложения на 1-5 секунд, тогда в Redis приходит по одному запросу в секунду от экземпляра, а не сотни тысяч.

Что должно прозвучать в ответе

  • Диагностика: метрики по узлам, redis-cli --hotkeys при политике LFU

  • Локальный кеш в процессе на 1-5 секунд для горячих ключей

  • Копии ключа с суффиксом на разных узлах, чтение случайной копии

  • Реплики Redis для чтения

  • Остаток товара считать отдельно и атомарно, не через тот же кеш

Что могут спросить следом

  • Как обновлять копии ключа согласованно?
  • Что делать со счётчиком остатка?

Разбор

Сначала подтверждаю диагноз: нагрузка на один узел кластера, по метрикам видно ключ. Самое эффективное: локальный кеш в каждом экземпляре приложения на 1-5 секунд, тогда в Redis приходит по одному запросу в секунду от экземпляра, а не сотни тысяч. Если нужен общий кеш, делаю N копий ключа с суффиксом, product:42:1 ... product:42:10, они попадают на разные слоты и узлы, читаю случайную. Можно читать с реплик. Карточка товара допускает устаревание на секунды, а вот остаток нет: его уменьшаю атомарно (DECR или Lua) и при необходимости раскладываю квоту по нескольким ключам.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.