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.