我想要删除特定的缓存密钥。我正在使用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代码显式地删除缓存。不是通过注解。我的功能是获取缓存键作为输入,并且只删除那些特定的键。
如果你还不明白我的问题,请告诉我。
发布于 2016-01-05 09:37:15
下面的代码适用于我,
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);
}
}
}
}发布于 2016-01-04 14:32:52
似乎你唯一错过的是:
cacheManager.getCache("MyCache").evict(ObjectToEvict);可以获得对此对象的引用(使用您想要删除的键),并使用上面的方法。
发布于 2016-01-04 13:47:29
有了这些代码,你就没有任何缓存了。@CacheEvict注释仅用于从指定的缓存中删除项,而不是放置它们。
假设您想坚持使用Spring注释:
@Cacheable注释放在要缓存的方法上。@CacheEvict注释放在应该触发从缓存中删除的方法上。请注意,密钥生成算法必须在@Cacheable和@CacheEvict之间保持一致,否则可能会出现过时的缓存。
阅读一下Spring官方文档的缓存抽象部分。
https://stackoverflow.com/questions/34591883
复制相似问题