Spring Cache proporciona una abstracción robusta para integrar mecanismos de caché en aplicaciones Spring Boot, utilizando anotaciones para simplificar su configuración y uso.
| Anotación | Función |
|---|---|
| @EnableCaching | Activa la funcionalidad de anotaciones de caché, generalmente en la clase de configuración principle. |
| @Cacheable | Antes de la ejecución del método, consulta la caché; si existen datos, los retorna directamente, de lo contrario ejecuta el método y almacena el resultado en la caché. |
| @CachePut | Inserta el valor de retorno del método en la caché, actualizando cuaqluier entrada existente con la misma clave. |
| @CacheEvict | Elimina una o múltiples entradas de la caché según la clave especificada. |
1. Configuración de Dependencias
La librería de Spring Cache es independiente del proveedor de caché, permitiendo alternar entre opciones como EHCache, Caffeine o Redis.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.5</version>
</dependency>
2. Habilitación de Caching
La anotación @EnableCaching se aplica a la clase principal para activar el soporte de caché.
@Slf4j
@SpringBootApplication
@EnableCaching // Habilita el motor de caché
public class AplicacionDemo {
public static void main(String[] args) {
SpringApplication.run(AplicacionDemo.class, args);
log.info("Servicio en ejecución.");
}
}
3. Ejemplos de Uso con Anotaciones
Anotación @CachePut
Almacena el resultado del método en la caché. La clave puede definirse mediante expresiones Spring EL (SpEL).
/**
* @CachePut: Persiste el retorno en la caché.
* value: Espacio de nombres de la caché.
* key: Expresión SpEL para la clave.
*/
@PostMapping("/registrar")
@CachePut(value = "productosCache", key = "#producto.id")
public Producto registrar(@RequestBody Producto producto) {
repositorioProducto.guardar(producto);
return producto;
}
Anotación @Cacheable
Realiza una consulta a la caché antes de ejecutar la lógica del método, retornando datos cacheados si están disponibles.
/**
* @Cacheable: Gestiona la lectura desde la caché.
* cacheNames: Identificador del caché.
* key: Clave basada en parámetros.
*/
@GetMapping("/consultar/{id}")
@Cacheable(cacheNames = "productosCache", key = "#id")
public Producto obtenerPorId(@PathVariable Long id) {
return repositorioProducto.buscarPorId(id).orElse(null);
}
Anotación @CacheEvict
Permite la invalidación selectiva de entradas en la caché.
@DeleteMapping("/eliminar/{id}")
@CacheEvict(cacheNames = "productosCache", key = "#id")
public void eliminar(@PathVariable Long id) {
repositorioProducto.borrarPorId(id);
}
@DeleteMapping("/limpiar")
@CacheEvict(cacheNames = "productosCache", allEntries = true)
public void limpiarCacheCompleta() {
repositorioProducto.eliminarTodos();
}