Карта / Spring Cache / @Cacheable, @CacheEvict

@Cacheable, @CacheEvict

Полный набор аннотаций кэширования Spring собран вместе — базовые принципы уже разобраны в темах «@Cacheable в Spring» и «Инвалидация кэша», здесь — сводка с реальным сценарием использования.

@Service
class ProductService {

    @Cacheable("products")
    Product getProduct(Long id) {
        return repository.findById(id).orElseThrow();   // выполнится только при первом вызове
    }

    @CachePut("products")
    Product updateProduct(Product product) {
        return repository.save(product);   // выполнится всегда, обновит и БД, и кэш
    }

    @CacheEvict("products")
    void deleteProduct(Long id) {
        repository.deleteById(id);   // удалит и из БД, и из кэша
    }

    @CacheEvict(value = "products", allEntries = true)
    void clearAllProducts() {
        // полностью очистить весь кэш "products" разом
    }
}
Копнуть глубже

Ключ кэша по умолчанию — это параметры метода. Можно настроить вручную через key:

@Cacheable(value = "products", key = "#id")
Product getProduct(Long id) { ... }

@Cacheable(value = "products", key = "#category + '_' + #page")
List<Product> getProducts(String category, int page) { ... }   // составной ключ

Условное кэширование — кэшировать не всегда, а только при выполнении условия:

@Cacheable(value = "products", condition = "#id > 0", unless = "#result == null")
Product getProduct(Long id) { ... }

condition проверяется до вызова метода (кэшировать ли вообще запрос), unlessпосле (не кэшировать, если результат подходит под условие, например null).

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