Je souhaite supprimer des clés de cache particulières. J'utilise java spring. J'ai différentes clés sous le même nom de cache. Je dois supprimer certaines clés particulières, pas tout le cache.
Le code de cache est comme ci-dessous,

@CacheEvict(value="MyCache", key="CACHE_LIST_COLUMNS + #accountId + '_' + #formType")
public void addListColumn(){.. my code..}

@CacheEvict(value="MyCache", key="CACHE_SUMMARY_FIELDS + #accountId + '_' + #formType")
public void addSummaryColumn(){.. my code..}

Maintenant, comme vous pouvez le voir sous le nom «MyCache», je dois utiliser différents caches avec des clés différentes. Quelqu'un peut-il me guider sur la façon dont nous pouvons obtenir la clé particulière d'un cache particulier et supprimer ce cache.

Je souhaite supprimer cette liste de cache:

value="MyCache", key="CACHE_SUMMARY_FIELDS + #accountId + '_' + #formType"

Voilà ce que j'essaie

 StringBuffer cacheNames = new StringBuffer();

 for (String cacheName : getCacheManager().getCacheNames()) {   
    Cache cache = getCacheManager().getCache(cacheName);
  cache.clear();
 }

Ce que fait ce code, c'est obtenir le cache du nom «MyCache» et efface tout ce MyCache. Mais je ne veux pas effacer toutes les entrées du cache. Par exemple, les clés sont,

CacheEvict(value="MyCache", key="CACHE_LIST_COLUMNS + 10000 + '_' + 3")
CacheEvict(value="MyCache", key="CACHE_SUMMARY_FIELDS + 10000 + '_' + 4")

Donc, les clés sont Key1 = CACHE_LIST_COLUMNS10000_3

            Key2 = CACHE_SUMMARY_FIELDS10000_4

Maintenant, je veux supprimer uniquement la clé CACHE_LIST_COLUMNS10000_3. Par conséquent, comment puis-je obtenir le cache 'MyCache' et la clé CACHE_LIST_COLUMNS10000_3, et supprimer uniquement les données liées à cette clé (CACHE_LIST_COLUMNS10000_3).

Je dois supprimer explicitement le cache via le code java. Pas par des annotations. Ma fonction sera d'obtenir les clés de cache en entrée et de supprimer uniquement ces clés particulières.

Si vous ne comprenez toujours pas ma question, faites-le moi savoir.

2
User3091 4 janv. 2016 à 16:05

4 réponses

Meilleure réponse

Le code ci-dessous fonctionne pour moi,

for (String cacheName : getCacheManager().getCacheNames()) {
logger.info("Clearing cache: " + cacheName);
Cache cache = getCacheManager().getCache(cacheName);
Object obj = cache.getNativeCache();
if (obj instanceof net.sf.ehcache.Ehcache) {
Ehcache ehCa = (Ehcache)obj;
List<Object> keys = ehCa.getKeys();

for (Object key : keys) {
    String keyString = (String)key;
    if (keyString.equalsIgnoreCase("CACHE_LIST_COLUMNS_10000_2")) 
        {
       cache.evict(key);
    }
 }
}
}
0
User3091 5 janv. 2016 à 09:37

Il semble que la seule chose qui vous manque est:

cacheManager.getCache("MyCache").evict(ObjectToEvict);

Il serait possible d'obtenir une référence à cet objet (avec la clé que vous souhaitez expulser), et d'utiliser la méthode ci-dessus.

3
Ian Mc 4 janv. 2016 à 14:32

Avec ce code, vous n'avez pas de cache. Le @CacheEvict l'annotation est utilisée uniquement pour supprimer des éléments du cache spécifié, pas pour les mettre.

En supposant que vous souhaitiez vous en tenir aux annotations Spring:

  1. cache-put: mettez {{ Annotation X0}} sur les méthodes que vous souhaitez mettre en cache.
  2. cache-evict: mettez {{ Annotation X0}} sur les méthodes qui doivent déclencher une suppression d'un cache

Notez que l'algorithme de génération de clé doit être cohérent entre @Cacheable et @CacheEvict, sinon vous risquez de vous retrouver avec un cache périmé.

Lisez l 'Abstraction du cache section des documents officiels du printemps.

0
Marco Ferrari 4 janv. 2016 à 13:47

Vous pouvez utiliser SPEL comme ceci.

@Cacheable(value = "mainTables", key = "#word.concat(':').concat(#image)")

SPEL peut voir

0
Tonney Bing 9 janv. 2016 à 03:44