Выбор ответа Senior Кеширование обновлено
Кеширование отсутствия значения
Вопрос
Боты массово запрашивают несуществующие товары /products/<случайный id>. Кеш не помогает, база под нагрузкой. Что сделать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Кешировать маркер «нет такого товара» на короткое время и ограничить частоту. Если cache.get возвращает None и для промаха, и для закешированного отсутствия, каждый запрос несуществующего id идёт в базу (cache penetration).
Варианты ответа
- Увеличить TTL существующих товаров, чтобы кеш реже обращался к базе
- Кешировать
Noneтак же, как обычное значение, черезcache.set(key, None) - Отключить кеш для карточек товаров, раз он всё равно не помогает
- Кешировать маркер «нет такого товара» на короткое время и ограничить частотуправильный ответ
Разбор
Если cache.get возвращает None и для промаха, и для закешированного отсутствия, каждый запрос несуществующего id идёт в базу (cache penetration). Решение: специальный маркер «не найдено» с коротким TTL, а против массового перебора лимиты частоты и иногда фильтр Блума существующих id. TTL существующих товаров на эту нагрузку не влияет, а сам None неотличим от промаха.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.