> Что такое негативный кэш и почему он вреден (Go)
Уровень: junior · Роль: backend · Категория: Технические вопросы
Компании: VK
Стек: Go
> Пример ответа
Негативный кэш (negative caching) - это механизм, при котором кэшируется факт отсутствия данных, а не сами данные. Например, если DNS-запрос вернул NXDOMAIN (домен не найден), этот ответ может быть сохранён в кэше на некоторое время, чтобы не повторять запрос к вышестоящему серверу.
В Go негативный кэш часто реализуется через map или in-memory хранилище (например, sync.Map), где ключ - это идентификатор запроса, а значение - признак отсутствия данных. Проблема в том, что такой кэш может быстро заполниться невалидными записями, особенно при большом количестве несуществующих ключей (например, при атаке перебором или при работе с динамическими данными).
Почему это вредно:
-
Утечка памяти - негативные записи занимают место, но не приносят пользы, так как их нельзя использовать для ответа. В Go это может привести к росту кучи и увеличению нагрузки на GC.
-
Снижение производительности - при каждом запросе несуществующего ключа сначала проверяется кэш (что бесполезно), а затем выполняется дорогой запрос к источнику. В итоге кэш только добавляет накладные расходы.
-
Блокировка корректных данных - если негативный кэш имеет длительный TTL, то после появления реальных данных (например, создание нового пользователя) кэш будет возвращать «нет данных» до истечения TTL, что приведёт к ошибкам в бизнес-логике.
-
Сложность инвалидации - в Go, если вы используете TTL-основанный кэш (например, с
time.After), негативные записи требуют отдельного управления, что усложняет код и повышает риск багов.
Рекомендация: избегайте негативного кэширования в Go, если только вы не работаете с системами, где запросы к источнику крайне дороги (например, внешние API). Вместо этого используйте кэширование только для успешных ответов, а для отсутствующих данных применяйте отдельные структуры с ограниченным размером (например, LRU-кэш) и коротким TTL.
> Похожие задачи по backend
Что такое селективность данных в базах данных
Является ли одиночный update транзакцией
Стоит ли кэшировать пустые результаты запросов к базе данных
Что такое MITM (man-in-the-middle) атака и как с ней бороться
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью