如何使用Java Spring从Cache中删除特定密钥

时间:2016-01-04 13:05:45

标签: java spring caching

我想删除特定的缓存键。我正在使用java spring。 我在相同的缓存名称下有不同的密钥。我必须删除一些特定的键,而不是整个缓存 缓存代码如下,

@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..}

现在您可以在名称“MyCache”下看到,我必须使用不同的密钥来使用不同的缓存。有人可以指导我如何从特定缓存中获取特定密钥并删除该缓存。

我想删除此缓存列表:

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

这就是我正在尝试的

 StringBuffer cacheNames = new StringBuffer();

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

这段代码的作用是获取名称“MyCache”的缓存并清除整个MyCache。但我不想清除所有缓存条目。 例如,键是,

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

所以键是Key1 = CACHE_LIST_COLUMNS10000_3

            Key2 = CACHE_SUMMARY_FIELDS10000_4

现在我想只删除密钥CACHE_LIST_COLUMNS10000_3。 因此,如何获取缓存“MyCache”和密钥CACHE_LIST_COLUMNS10000_3, 并仅删除与此密钥相关的数据(CACHE_LIST_COLUMNS10000_3)。

我必须通过java代码显式删除缓存。不是通过注释。 我的功能是将缓存键作为输入,只删除那些特定键。

如果您仍然不理解我的问题,请告诉我。

4 个答案:

答案 0 :(得分:3)

似乎唯一缺少的是:

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

可以获得对这个对象的引用(使用你要驱逐的键),并使用上面的方法。

答案 1 :(得分:0)

使用该代码,您没有任何缓存。 @CacheEvict注释仅用于从指定的缓存中删除项目,而不是用于放置它们。

假设你想坚持使用Spring注释:

  1. cache-put:将@Cacheable注释放在要缓存的方法上。
  2. cache-evict:对应触发从缓存中删除的方法放置@CacheEvict注释
  3. 请注意,密钥生成算法必须在@Cacheable@CacheEvict之间保持一致,否则您最终可能会遇到过时的缓存。

    阅读Spring官方文档的Cache Abstraction部分。

答案 2 :(得分:0)

以下代码对我有用,

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);
    }
 }
}
}

答案 3 :(得分:0)

你可以像这样使用SPEL。

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

SPEL可以看到