首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java从缓存中删除特定的密钥

如何使用Java从缓存中删除特定的密钥
EN

Stack Overflow用户
提问于 2016-01-04 13:05:45
回答 4查看 11.2K关注 0票数 2

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

缓存代码如下所示,

代码语言:javascript
复制
@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‘,我必须使用不同的缓存与不同的键。有人能指导我如何从特定的缓存中获取特定的密钥并删除该缓存吗?

我想删除这个缓存列表:

代码语言:javascript
复制
value="MyCache", key="CACHE_SUMMARY_FIELDS + #accountId + '_' + #formType"

这就是我正在尝试的

代码语言:javascript
复制
 StringBuffer cacheNames = new StringBuffer();

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

这段代码所做的是获取名称' MyCache‘的缓存,并清除整个MyCache。但我不想清除所有的缓存条目。例如钥匙是,

代码语言:javascript
复制
CacheEvict(value="MyCache", key="CACHE_LIST_COLUMNS + 10000 + '_' + 3")
CacheEvict(value="MyCache", key="CACHE_SUMMARY_FIELDS + 10000 + '_' + 4")

所以密钥是Key1 = CACHE_LIST_COLUMNS10000_3

代码语言:javascript
复制
            Key2 = CACHE_SUMMARY_FIELDS10000_4

现在我只想删除键CACHE_LIST_COLUMNS10000_3,因此我如何获得缓存'MyCache‘和键CACHE_LIST_COLUMNS10000_3,并且只删除与该键相关的数据(CACHE_LIST_COLUMNS10000_3)。

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

如果你还不明白我的问题,请告诉我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-05 09:37:15

下面的代码适用于我,

代码语言:javascript
复制
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);
    }
 }
}
}
票数 1
EN

Stack Overflow用户

发布于 2016-01-04 14:32:52

似乎你唯一错过的是:

代码语言:javascript
复制
cacheManager.getCache("MyCache").evict(ObjectToEvict);

可以获得对此对象的引用(使用您想要删除的键),并使用上面的方法。

票数 3
EN

Stack Overflow用户

发布于 2016-01-04 13:47:29

有了这些代码,你就没有任何缓存了。@CacheEvict注释仅用于从指定的缓存中删除项,而不是放置它们。

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

  1. 缓存-放置:将@Cacheable注释放在要缓存的方法上。
  2. 缓存-退出:将@CacheEvict注释放在应该触发从缓存中删除的方法上。

请注意,密钥生成算法必须在@Cacheable@CacheEvict之间保持一致,否则可能会出现过时的缓存。

阅读一下Spring官方文档的缓存抽象部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34591883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档