如何使用JavaSpring从缓存中删除特定密钥

如何使用JavaSpring从缓存中删除特定密钥,java,spring,caching,Java,Spring,Caching,我想删除特定的缓存密钥。我正在使用JavaSpring。 我在同一个缓存名称下有不同的密钥。我必须删除一些特定的密钥,而不是整个缓存。 缓存代码如下所示 @CacheEvict(value="MyCache", key="CACHE_LIST_COLUMNS + #accountId + '_' + #formType") public void addListColumn(){.. my code..} @CacheEvict(value="MyCache", key="CACHE_SUMM

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

@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\u LIST\u COLUMNS10000\u 3

            Key2 = CACHE_SUMMARY_FIELDS10000_4
现在我只想删除键缓存\列表\列1000\ 3。 因此,如何获取缓存“MyCache”和键缓存列表列1000\u 3, 并仅删除与此键相关的数据(缓存列表列1000列3)

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


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

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

假设您希望坚持使用弹簧注释:

  • 缓存放置:在要缓存的方法上放置注释
  • 缓存逐出:将注释放在应该触发从缓存中删除的方法上
  • 请注意,密钥生成算法必须在和之间保持一致,否则可能会导致缓存过时


    阅读一下Spring官方文档部分。

    似乎你唯一缺少的是:

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

    可以获取对该对象的引用(使用要逐出的键),并使用上面的方法。

    下面的代码适用于我

    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);
        }
     }
    }
    }
    
    for(字符串cacheName:getCacheManager().getCacheNames()){
    logger.info(“清除缓存:+cacheName”);
    Cache Cache=getCacheManager().getCache(cacheName);
    Object obj=cache.getNativeCache();
    if(obj instanceof net.sf.ehcache.ehcache){
    Ehcache-ehCa=(Ehcache)obj;
    List keys=ehCa.getKeys();
    用于(对象关键点:关键点){
    字符串键字符串=(字符串)键;
    if(keyString.equalsIgnoreCase(“缓存列表列10000列2”))
    {
    cache.execute(键);
    }
    }
    }
    }
    
    您可以这样使用SPEL

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

    可以看到

    您的问题并不完全清楚,但是您可以使用spring表达式语言引用方法签名中的参数作为逐出的一部分。看到很高兴听到!如果你可以通过选择对你有用的答案来“结束”这个问题,或者创建自己的答案并在那里提供解决方案,那将是一件非常棒的事情。干杯