@CacheEvict在SpringBoot中不起作用

时间:2017-12-30 20:36:52

标签: spring

PUSH_PROMISE

缓存工作正常,但我无法使用@CacheEvict注释。我想在Cacheable方法之后立即调用cacheEvict方法。 在Cachable方法(queryCenterAPI)之后不调用resetOnRequest()方法。

4 个答案:

答案 0 :(得分:5)

应该从不同的类调用缓存逐出方法,否则它将不起作用,与带有@Cacheable批注的方法相同。

答案 1 :(得分:1)

替代@CacheEvict 注释的另一种不同方式是使用 CacheManager > https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/CacheManager.html

对于单个值;

public void evictSingleCacheValue(String cacheName, String cacheKey) {
    cacheManager.getCache(cacheName).evict(cacheKey);
}

对于所有值;

public void evictAllCacheValues(String cacheName) {
    cacheManager.getCache(cacheName).clear();
}

答案 2 :(得分:0)

我认为你需要切换到" aspectj"模式,以使public void DoSomething() { WriteString(item.Data.Type.ToString()); if (item.Data.Type.ToString().ToLower() == "b") { WriteString(item.Data.ItemName); } else { WriteInteger(item.Data.SpriteId); if (item.Data.InteractionType == InteractionType.WALLPAPER || item.Data.InteractionType == InteractionType.FLOOR || item.Data.InteractionType == InteractionType.LANDSCAPE) { WriteString(item.Name.Split('_')[2]); } else if (item.Data.InteractionType == InteractionType.BOT) //Bots { WriteString(!PlusEnvironment.GetGame().GetCatalog().TryGetBot(item.ItemId, out var catalogBot) ? "hd-180-7.ea-1406-62.ch-210-1321.hr-831-49.ca-1813-62.sh-295-1321.lg-285-92" : catalogBot.Figure); } else if (item.ExtraData != null) { WriteString(item.ExtraData ?? string.Empty); } WriteInteger(item.Amount); WriteBoolean(item.IsLimited); if (item.IsLimited) { WriteInteger(item.LimitedEditionStack); WriteInteger(item.LimitedEditionStack - item.LimitedEditionSells); } } } 正常工作。

从春天more

  

处理缓存注释的默认建议模式是" proxy"   它允许仅通过代理拦截呼叫;本地   同一个类中的调用不能以这种方式截获。为一个   更高级的拦截模式,考虑切换到" aspectj"   模式与编译时或加载时编织相结合。

第二个选项是尝试将@CacheEvict方法移动到另一个类中。

答案 3 :(得分:0)

使用ehcache对我有用,添加下面的Xml文件和Config文件足以进行缓存和缓存逐出。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd"
    updateCheck="true"
    monitoring="autodetect"
    dynamicConfig="true">

    <diskStore path="java.io.tmpdir" />

    <cache name="apis"
        eternal="false"
        maxEntriesLocalHeap="10000"
        maxEntriesLocalDisk="1000" 
        diskSpoolBufferSizeMB="20"
        timeToIdleSeconds="200" timeToLiveSeconds="900"
        memoryStoreEvictionPolicy="LFU"
        transactionalMode="off">
    </cache>

public class AppConfig {

    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheCacheManager().getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheCacheManager() {
        EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
        cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
        cmfb.setShared(true);
        return cmfb;
    }
} 

我们只需要在xml文件中配置并给出发生缓存驱逐的时间。