Карта / Spring Cache / Провайдеры кэша

Провайдеры кэша

@Cacheable сама по себе не хранит данные — она просто описывает “что кэшировать”, а реальное хранение делает подключённый провайдер кэша. Без провайдера аннотации не работают.

<!-- Caffeine — простой in-memory кэш для одного приложения -->
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>
spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=500,expireAfterWrite=10m
<!-- Redis — распределённый кэш, общий для нескольких инстансов приложения -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Копнуть глубже

Когда выбирать Caffeine, а когда Redis:

Caffeine (in-memory)Redis (распределённый)
Где живут данныев памяти приложенияотдельный сервер
Скоростьмаксимальная (без сети)чуть медленнее (сетевой запрос)
Общий для нескольких инстансовнет, у каждого свойда
Переживает перезапускнетда

Caffeine хорош для одиночного приложения или когда не критично, что разные инстансы видят немного разный кэш. Redis обязателен, когда приложение работает в нескольких копиях (за балансировщиком), и важно, чтобы все они видели одинаковый, согласованный кэш.

Комбинация двух провайдеров — это и есть тот самый двухуровневый кэш (см. тему «Двухуровневый кэш»): Caffeine как быстрый L1, Redis как общий L2, согласованный между всеми инстансами приложения.

🎤 Закрыл тему, если можешь объяснить:
• зачем нужен провайдер кэша помимо самой аннотации `@Cacheable`;
• когда выбирать Caffeine, а когда Redis (если дошёл до 2-го слоя).