9
votes

Comment itération sur une entrée de cache

J'utilise Spring3.1 dans Standalone env. Je cache mon entrée à l'aide de @cachable Annotation.

Parfois, j'ai besoin de itérer sur la liste de mise en cache afin d'obtenir valeur spécifique forte> (non clé). P>

donc j'ai géré Pour récupérer la liste mise en cache, mais comment pourrais-je itérair sur ses éléments. P>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
        p:cache-manager-ref="ehcache" />

    <bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
        p:config-location="classpath:ehcache.xml" />


0 commentaires

5 Réponses :


16
votes

CACHEMANAGER.GETCACHACHACHE () renvoie un Net.sf.ehcache.cache, qui a une méthode getKeys () qui renvoie une liste de clés de cache que vous pouvez itération. Pour récupérer l'objet réel qui a été stocké (par opposition au Net.Sf.eHCache.Element enveloppé), utilisez l'élément.getObjectValue ().

EDIT: Selon le printemps Il ne ressemble pas à ce qu'ils supporteront jamais la cache.getKeys () , Donc, vous devrez vous lancer vers le fournisseur sous-jacent.

quelque chose comme ceci: xxx


4 commentaires

Mais je n'ai pas de méthode cache.getkeys (). J'utilise org.springframework.cache.cache


Avez-vous trouvé une solution? Comment iTerez-vous sur le cache Infinispan. J'ai besoin de clés.


Avez-vous été lancé au fournisseur sous-jacent?


Cette réponse suppose que l'objet de type cache hérité a une méthode getkeys. Ce n'est pas toujours vrai et une telle cache, comme mention ci-dessus, l'org.springframework.cache.cache n'inclut pas cela.



0
votes

La méthode ci-dessous donnera un ensemble de touches d'objets mis en cache, mais si vous ajoutez votre cache avec des touches, il est facile de récupérer (si vous ajoutez directement une liste directement des objets au cache, cela ne fonctionnera pas). Aussi, j'ai utilisé Guavacache dans le responsable du cache comme ci-dessous. P>

public Set<Object> getAllCachedUserLabKeys() {
    Set<Object> keys = null;
    try {
        GuavaCache cache = (GuavaCache) cacheManager.getCache("yourCacheName");
        if (cache != null) {
            ConcurrentMap<Object, Object> cachedMap = cache.getNativeCache().asMap();
            keys = cachedMap.keySet();
        }
    } catch (Exception e) {
        LOGGER.error("Unknown exception occured while fetchting all cached User Labs..!", e);
    }
    return keys;
}


0 commentaires

7
votes

Une autre solution, pars.springframework.cache.cache à javax.cache.cache à l'aide de la méthode getnativecache () et utilisez java itérateur comme javax.cache.cache s'étend déjà iTrable>.

Pour plus de détails Lire javax.cache.cache javadoc < / p> xxx


0 commentaires

0
votes

J'utilise ceci

​​premier point final vous dira que les caches que vous avez

second Endpoint vous donneront toutes les entrées d'un cache spécifique (avec cartographie sécurisée)

troisième EndPoint vous donnera toutes les entrées de tous vos caches (avec mappage sûr) xxx


0 commentaires

0
votes
var cache = cacheManager.getCache("CACHE_NAME");
var nativeCache = (ConcurrentHashMap<?, ?>) cache.getNativeCache();

for (var entry: nativeCache.entrySet()){
    // Access entry key and value
    entry.getKey()
    entry.getValue()
}

0 commentaires