Провайдеры кэша
@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-го слоя).
• когда выбирать Caffeine, а когда Redis (если дошёл до 2-го слоя).