【问题标题】:How can I remove a particular key from Cache using Java Spring如何使用 Java Spring 从缓存中删除特定键
【发布时间】:2020-07-16 13:17:57
【问题描述】:

我想删除特定的缓存键。我正在使用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 代码显式删除缓存。不是通过注释。 我的功能是获取缓存键作为输入并仅删除那些特定的键。

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

【问题讨论】:

标签: java spring caching


【解决方案1】:

看来你唯一缺少的是:

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

有可能获得对该对象的引用(使用您要驱逐的密钥),并使用上述方法。

【讨论】:

  • 很高兴听到!如果您可以通过选择适合您的答案或创建您自己的答案并在那里提供您的解决方案来“关闭”问题,那就太好了。干杯!
【解决方案2】:

下面的代码对我有用,

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】:

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

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

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

    请注意,@Cacheable@CacheEvict 之间的密钥生成算法必须一致,否则您可能会得到一个陈旧的缓存。

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

    【讨论】:

      【解决方案4】:

      你可以像这样使用 SPEL。

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

      SPEL可以看到

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多