java - Spring Cache con colección de artículos/entidades
spring-cache (1)
De hecho, es posible, incluso con la abstracción de almacenamiento en caché de Spring , pero no fuera de la caja (OOTB). Esencialmente, debe personalizar la infraestructura de almacenamiento en caché de Spring (se explica más adelante)
De manera
predeterminada
,
la
infraestructura de almacenamiento
en
caché
de Spring
utiliza todos los argumentos del parámetro del método
@Cacheable
como la "clave" de la memoria caché, como se explica
here
.
Por supuesto, también puede personalizar la resolución de la clave utilizando una
Expresión SpEL
o con una implementación personalizada de
KeyGenerator
, como se explica
here
.
Aún así, eso
no
@Cacheable
la colección o matriz de
argumentos
de
parámetros
junto con el
@Cacheable
de
retorno
del método
@Cacheable
en entradas de caché individuales (es decir, pares clave / valor basados en la matriz / colección o Mapa).
Para eso, necesita una implementación personalizada de
Spring''s
CacheManager
(dependiendo de su estrategia / proveedor de almacenamiento en caché) y las interfaces de
Cache
.
NOTA: Irónicamente, esta será la tercera vez que respondo casi la misma pregunta, primero here , luego here y ahora aquí :-). De todas formas...
He actualizado / limpiado mi ejemplo (un poco) para esta publicación.
Observe que
mi ejemplo extiende y personaliza
el
ConcurrentMapCacheManager
provisto en
Spring Framework
.
Teóricamente, podría extender / personalizar cualquier implementación de
CacheManager
, como
Redis
en
Spring Data Redis
,
here
(
source
), o
CacheManager de Pivotal
CacheManager
en
Spring Data GemFire
,
here
(
source
).
La versión de código abierto de
Pivotal GemFire
es
Apache Geode
, que tiene un proyecto correspondiente de
Spring Data Geode
, (
fuente para CacheManager
en
Spring Data Geode
, que es básicamente idéntico a SD GemFire).
Por supuesto, puede aplicar esta técnica a otros proveedores de almacenamiento en caché ... Hazelcast, Ehcache, etc.
Sin embargo, las entrañas reales del trabajo se manejan mediante la implementación personalizada (o más específicamente, la clase base ) de la interfaz de Spring Cache .
De todos modos, con suerte, a partir de mi ejemplo , podrá averiguar qué debe hacer en su aplicación para satisfacer los requisitos de almacenamiento en caché de su aplicación.
Además, puede aplicar el mismo enfoque para manejar
Maps
, pero lo dejaré como un ejercicio para usted ;-).
¡Espero que esto ayude!
Saludos, John
Estoy usando Spring Cache, donde paso una colección de claves, y la devolución es una lista de entidades. Me gustaría que el marco de almacenamiento en caché comprenda que cada elemento de la lista de retorno debe almacenarse en caché con el código correspondiente. Por el momento, parece que la clave es la lista completa, y si me falta una clave en la siguiente llamada, intentará volver a cargar toda la colección.
@Override
@Cacheable(value = "countries")
public List<Country> getAll(List<String>codes) {
return countryDao.findAllInCodes(codes);
}
Otra posibilidad es que el retorno sea un mapa, de manera similar, me gustaría que el caché sea lo suficientemente inteligente como para consultar solo los elementos que nunca antes se consultaron, también para almacenar en caché cada elemento con su clave.
@Override
@Cacheable(value = "countries")
public Map<String,Country> getAllByCode(List<String>codes) {
return countryDao.findAllInCodes(codes);
}
Supongamos que la clase de país se ve así:
class Country{
String code;
String fullName;
long id;
... // getters setters constructurs etc..
}
¿Es esto posible con Spring Cache?