Вопрос проверяет, понимаете ли вы ограничения кеша при высокой вариативности результата и умеете ли выбирать стратегии: кешировать части, ограничивать энтропию выдачи и защищать систему от перегрузки.
Если выдача должна меняться каждый раз, “кеш полного ответа” почти бесполезен: ключи становятся уникальными, hit rate падает, а память расходуется быстро. Появляется сложность с консистентностью: что считать правильным ответом, если он всегда разный. Часто приходится кешировать не выдачу, а её части (пулы кандидатов, справочники, профили), а перемешивание/персонализацию делать быстро в памяти. Ещё один подход — кешировать “затраты” (предрасчёт кандидатов), а не “форму” ответа.
Кеш эффективен, когда есть повторяемость. Если результат намеренно меняется, повторяемости почти нет, и кеш перестаёт быть экономически выгодным.
Типичная ситуация:
ключ зависит от множества параметров + случайности + времени
каждый запрос создаёт новый ключ
Последствия:
hit rate близок к нулю
Redis забивается мусорными ключами
растёт стоимость сериализации/десериализации
Если ответ меняется каждый раз:
сложно определить, что именно кешировать
сложно валидировать консистентность
трудно объяснить клиентам, почему “вчера было так, а сейчас иначе” (если это важно)
Даже при коротком TTL остаются проблемы:
гонки при одновременной генерации (thundering herd)
непредсказуемые пики пересчёта
Определение: Thundering herd — когда много запросов одновременно запускают пересчёт из-за промаха кеша.
Например:
хранить пул id подходящих объектов (кандидатов)
в запросе быстро выбирать/перемешивать/ранжировать
Если бизнес допускает:
менять только часть выдачи (например, 20% ротируется)
фиксировать выдачу на короткое окно времени (например, на 30-60 секунд)
Это резко улучшает повторяемость и делает кеш полезным.
тяжёлый расчёт “кто подходит”
быстрый расчёт “в каком порядке показать”
Даже без “полезного кеша” можно кешировать:
rate limit решения
“последний успешный результат” (stale) для деградации
блокировку пересчёта (singleflight/lock)
При “всегда новом” результате кеш полного ответа обычно не работает: низкий hit rate, взрыв ключей, сложная консистентность. На практике кешируют кандидатов/части ответа и тяжёлые промежуточные вычисления, а финальную вариативность делают дешёвой.