在expireafteraccess/expireafterwrite之后不会收回缓存

c7rzv4ha  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(488)

我的配置:

@Bean
public CaffeineCacheManager cacheManager() {
    return new CaffeineCacheManager();
}

@Bean
public CaffeineCache testCache() {
    return new CaffeineCache("test_cache",
            Caffeine.newBuilder()
                    .maximumSize(10000)
                    .expireAfterAccess(30, TimeUnit.SECONDS)
                    .expireAfterWrite(30, TimeUnit.SECONDS)
                    .recordStats()
                    .build());
}

测试代码:(连续读取缓存3次,每次读取之间暂停45秒)

static int value = 1;
    ...

    Cache testCache = cacheManager.getCache("test_cache");
    System.out.println("read " + testCache.get("myKey", () -> value++));
    try {
        Thread.sleep(45000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("read " + testCache.get("myKey", () -> value++));
    try {
        Thread.sleep(45000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("read " + testCache.get("myKey", () -> value++));

实际结果:

read 1
read 1
read 1

预期结果:缓存在30秒后被逐出:

read 1
read 2
read 3

我错了什么?
如何修复?

ss2ws0br

ss2ws0br1#

我自己也没用过咖啡因,但我读了一些书,下面是我发现的。

怎么了

咖啡因的缓存同步进行维护。因此,除非调用 putcleanUp . 这是来自他们的javadoc:
某些缓存配置将导致定期维护任务的累积,这些任务将在写入操作期间执行,或在没有写入的情况下偶尔执行读取操作。返回的缓存的cache.cleanup()方法也将执行维护,但在高吞吐量缓存中不需要调用它。只有使用maximumsize、maximumweight、expireafterwrite、expireafteraccess、weakkeys、WeakValue或SoftValue构建的缓存才能执行定期维护。

修复

试着打电话 testCache.cleanUp() 在你打电话之前 testCache.get(...)

相关问题