我想删除特定的缓存键。我正在使用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代码显式删除缓存。不是通过注释。 我的功能是将缓存键作为输入,只删除那些特定键。
如果您仍然不理解我的问题,请告诉我。
答案 0 :(得分:3)
似乎唯一缺少的是:
cacheManager.getCache("MyCache").evict(ObjectToEvict);
可以获得对这个对象的引用(使用你要驱逐的键),并使用上面的方法。
答案 1 :(得分:0)
使用该代码,您没有任何缓存。 @CacheEvict
注释仅用于从指定的缓存中删除项目,而不是用于放置它们。
假设你想坚持使用Spring注释:
@Cacheable
注释放在要缓存的方法上。@CacheEvict
注释请注意,密钥生成算法必须在@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)