java spring spring-cache

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?