Как TTL влияет на производительность кэша
Что проверяют
Понимаете ли вы, что TTL это компромисс между долей попаданий в кеш и свежестью данных, и умеете ли его настраивать в конкретной библиотеке. Следом часто спрашивают про лавину промахов, когда много ключей истекает одновременно.
Как отвечать
Опишите два конца шкалы:
- короткий TTL: данные свежие, но растёт доля промахов, запросы чаще доходят до базы, растут латентность и нагрузка на источник;
- длинный TTL: высокий hit rate, но пользователь дольше видит устаревшие данные, а кеш дольше держит редко нужные записи.
Затем покажите, что знаете инструменты. В Caffeine есть expireAfterWrite (срок от записи), expireAfterAccess (от последнего обращения) и refreshAfterWrite: после этого срока запись обновляется асинхронно, а читатели пока получают старое значение и не ждут базу. В Redis TTL задаётся через SET key value EX 60 или EXPIRE. В Spring Cache аннотация @Cacheable сама TTL не задаёт, он настраивается у провайдера, например RedisCacheConfiguration.entryTtl(Duration).
Важная часть ответа про stampede. Если популярный ключ истёк, сотни потоков одновременно идут в базу. Помогают загрузка одного значения на ключ (LoadingCache в Caffeine, @Cacheable(sync = true) в Spring), случайный разброс TTL, чтобы пачка ключей, загруженная разом, не истекала в одну секунду, и фоновое обновление.
Выбирать TTL стоит по данным: как часто меняется сущность, насколько вредна устаревшая версия и что показывает hit rate в метриках (recordStats() в Caffeine, Micrometer). Для данных, которые меняет само приложение, TTL не заменяет инвалидацию: при записи ключ сбрасывают через @CacheEvict.
Где спотыкаются
Ставят один TTL на всё: справочник валют и остаток на складе живут в одном кеше с одним сроком.
Считают, что TTL ограничивает память. Без maximumSize локальный кеш под нагрузкой может дорасти до OutOfMemoryError: истёкшие записи перестают возвращаться сразу, но физически удаляются только при обслуживании кеша.
Забывают про одновременное истечение и получают пики нагрузки на базу ровно через TTL после прогрева или деплоя.