Выбор ответа Senior Кеширование обновлено

Кеширование отсутствия значения

Вопрос

Боты массово запрашивают несуществующие товары /products/<случайный id>. Кеш не помогает, база под нагрузкой. Что сделать?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Кешировать маркер «нет такого товара» на короткое время и ограничить частоту. Если cache.get возвращает None и для промаха, и для закешированного отсутствия, каждый запрос несуществующего id идёт в базу (cache penetration).

Варианты ответа

  1. Увеличить TTL существующих товаров, чтобы кеш реже обращался к базе
  2. Кешировать None так же, как обычное значение, через cache.set(key, None)
  3. Отключить кеш для карточек товаров, раз он всё равно не помогает
  4. Кешировать маркер «нет такого товара» на короткое время и ограничить частотуправильный ответ

Разбор

Если cache.get возвращает None и для промаха, и для закешированного отсутствия, каждый запрос несуществующего id идёт в базу (cache penetration). Решение: специальный маркер «не найдено» с коротким TTL, а против массового перебора лимиты частоты и иногда фильтр Блума существующих id. TTL существующих товаров на эту нагрузку не влияет, а сам None неотличим от промаха.

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

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