我的配置:
@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
我错了什么?
如何修复?
1条答案
按热度按时间ss2ws0br1#
我自己也没用过咖啡因,但我读了一些书,下面是我发现的。
怎么了
咖啡因的缓存同步进行维护。因此,除非调用
put
或cleanUp
. 这是来自他们的javadoc:某些缓存配置将导致定期维护任务的累积,这些任务将在写入操作期间执行,或在没有写入的情况下偶尔执行读取操作。返回的缓存的cache.cleanup()方法也将执行维护,但在高吞吐量缓存中不需要调用它。只有使用maximumsize、maximumweight、expireafterwrite、expireafteraccess、weakkeys、WeakValue或SoftValue构建的缓存才能执行定期维护。
修复
试着打电话
testCache.cleanUp()
在你打电话之前testCache.get(...)