缓存时间(timetoliveseconds)在Spring Boot配置的Ehcache中无效。

3
以下是我的ehcache配置文件
<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="trans"
        maxEntriesLocalHeap="10000"
        maxEntriesLocalDisk="1000"
        eternal="false"
        diskSpoolBufferSizeMB="20"
        timeToIdleSeconds="0"
        timeToLiveSeconds="6"
        memoryStoreEvictionPolicy="LFU"
        transactionalMode="off">
        <persistence strategy="localTempSwap" />
    </cache>    
</ehcache>

所有Spring注解和配置都正常工作

@Component
@CacheConfig(cacheNames = {"trans" })
public class MyTransService {

    private List<Trans> list;

    @Autowired
    private EhCacheCacheManager manage;

    @PostConstruct
    public void setup() {
        list = new ArrayList<>();
    }

    @CachePut
    public void addTransaction(Trans trans) {
        this.list.add(trans);
    }

    @CacheEvict(allEntries = true)
    public void deleteAll() {
        this.list.clear();
    }    
}

但是缓存在timetoliveseconds之后没有清除。

有人能帮我看看我的配置出了什么问题吗?

下面的页面说这是一个bug,但不确定如何解决?
我正在使用spring-boot-starter-cache-2.0.3版本。

https://github.com/ehcache/ehcache-jcache/issues/26

有一些类似的问题,但没有提供任何解决方案。

2个回答

4

使用 ehcache-JSR-107 包装器得以解决该问题。以下是 Java 配置:

@Component
public class CachingSetup implements JCacheManagerCustomizer {

     @Override
     public void customize(CacheManager cacheManager)
     {
       cacheManager.createCache("trans", new MutableConfiguration<>()
         .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(SECONDS, 10)))
         .setStoreByValue(false)
         .setStatisticsEnabled(true));
     }
}

Pom

<dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-cache</artifactId> <!--Starter for using Spring Framework's caching support-->
        </dependency>           
        <dependency>
          <groupId>javax.cache</groupId> <!-- JSR-107 API-->
          <artifactId>cache-api</artifactId>
        </dependency>
        <dependency>
          <groupId>org.ehcache</groupId>
          <artifactId>ehcache</artifactId>
          <version>3.0.0</version>
        </dependency>
    </dependencies>

3
如果您希望缓存内容在没有交互的情况下消失,那么实际上并没有发生这种情况。Ehcache没有后台检查过期项并迫使其删除。
相反,过期项的删除是内联进行的,每当您尝试访问它们时,或者如果在对缓存进行写入期间,由于缓存已满而引发驱逐时。

谢谢,我会检查一下。我使用了CreatedExpiryPolicy策略来解决问题。 - Niraj Sonawane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接