Gymterview
junior

Что такое кэширование и зачем оно нужно?

Кэширование — это механизм хранения результатов дорогих операций (запросы к БД, вычисления, вызовы внешних API) в быстром промежуточном хранилище для повторного использования без повторного вычисления.

Аналогия из жизни: кэш — это как закладка в книге. Вместо того чтобы каждый раз листать с начала до нужной страницы, вы открываете книгу сразу в нужном месте. Закладка занимает мало места, но экономит время.

Зачем нужно кэширование

  • Снижение latency — чтение из памяти (~1 мкс) вместо чтения из БД (~1-10 мс) или вызова API (~50-500 мс)
  • Снижение нагрузки на БД и внешние сервисы
  • Повышение throughput — один экземпляр приложения может обслуживать больше запросов

Уровни кэширования

Пример
Клиент (браузер)  →  CDN  →  API Gateway  →  Приложение (L1 in-memory)  →  Распределённый кэш (L2 Redis)  →  БД
Уровень Хранилище Latency Примеры
Браузер HTTP Cache 0 мс (локально) Cache-Control, ETag
CDN Edge-серверы 5-50 мс CloudFront, Cloudflare
API Gateway Встроенный кэш 1-5 мс Nginx, Spring Cloud Gateway
Приложение (L1) Heap JVM <1 мс Caffeine, Guava, ConcurrentHashMap
Распределённый (L2) Redis, Memcached 1-5 мс Spring Data Redis
БД Query Cache 1-10 мс PostgreSQL, MySQL

Что кэшировать

  • Результаты частых и одинаковых запросов (справочники, каталоги, профили)
  • Результаты дорогих вычислений (агрегации, отчёты)
  • Ответы внешних API (курсы валют, геолокация)
  • Сессии пользователей, токены

Что НЕ кэшировать

  • Часто обновляемые данные (баланс счёта, инвентарь в реальном времени)
  • Уникальные данные (каждый запрос уникален — кэш не помогает)
  • Конфиденциальные данные (без шифрования)

Ключевые принципы

  • Кэширование — это компромисс: ускорение за счёт возможной неактуальности данных
  • Два главных вопроса: что кэшировать и когда инвалидировать
  • «There are only two hard things in computer science: cache invalidation and naming things» — Phil Karlton

Частые ошибки

  • Кэширование всего подряд — кэш с hit rate < 50% потребляет память без пользы
  • Отсутствие TTL — данные в кэше вечно устаревшие
  • Кэширование null-результатов без осознания — повторные запросы несуществующих ресурсов не доходят до БД, но кэш растёт
  • Не мониторить hit/miss ratio — без метрик невозможно оценить эффективность

Как используется в 2026

  • Кэширование — обязательная часть production-системы
  • Redis — стандарт для распределённого кэша
  • Caffeine — стандарт для in-process кэша
  • Spring Cache абстракция — декларативный подход через аннотации

На собеседовании: интервьюер хочет услышать не только определение, но и понимание компромиссов: кэш ускоряет, но создаёт проблему актуальности данных. Частая ошибка — забыть упомянуть уровни кэширования и сказать только про Redis.