Какой провайдер кэширования использовался в вашем последнем проекте и почему?

«Какой провайдер кэширования использовался в вашем последнем проекте и почему?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В последнем проекте использовался 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-готовых политик.