Ответ
В последнем проекте использовался Caffeine в качестве провайдера кэша для Spring Cache Abstraction.
Причины выбора Caffeine:
- Высокая производительность: Оптимизированная реализация на основе
ConcurrentHashMap, часто превосходит Ehcache и Guava Cache. - Гибкая политика вытеснения: Поддержка размера, времени жизни (TTL/TTI), весов записей.
- Асинхронное обновление: Возможность автоматической перезагрузки значений по истечении срока действия.
- Статистика: Встроенный сбор метрик (hit rate, load time).
- Современный и активно поддерживаемый.
Пример конфигурации в Spring Boot:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
// Глобальная конфигурация по умолчанию
cacheManager.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES) // Запись устаревает через 10 мин
.maximumSize(1000) // Макс. 1000 записей в кэше
.recordStats()); // Включение сбора статистики
return cacheManager;
}
}
// Использование в сервисе
@Service
public class ProductService {
@Cacheable(cacheNames = "products", key = "#id")
public Product getProductById(Long id) {
// Дорогой вызов в БД выполняется только при промахе кэша
return productRepository.findById(id).orElseThrow();
}
@CacheEvict(cacheNames = "products", key = "#product.id")
public Product updateProduct(Product product) {
// При обновлении запись инвалидируется
return productRepository.save(product);
}
}
Альтернативы и когда их использовать:
- Ehcache 3/ JCache (JSR-107): Для сложных распределенных или многоуровневых кэшей.
- Redis: Для распределенного кэширования между несколькими экземплярами приложения.
- Simple (Spring по умолчанию): Только для простых сценариев, без production-готовых политик.