@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-го слоя).
• как настроить ключ кэша и условное кэширование через `condition`/`unless` (если дошёл до 2-го слоя).