问题描述
我的配置:
@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++));
实际结果:
read 1
read 1
read 1
预期结果:缓存在 30 秒后被驱逐:
read 1
read 2
read 3
我做错了什么?
如何解决?
解决方法
仅供参考,CaffeineCacheManager
和 CaffeineCache
是围绕真正 Caffeine 缓存的 Spring 包装器。
org.springframework.cache.caffeine
.CaffeineCache
实现了 org.springframework.cache
.Cache
(强调两者的包)
至于您的问题,从您的 CaffeineCacheManager
返回的 @Bean
实际上没有缓存。因此,当您调用 cacheManager.getCache("test_cache")
时,您将获得 Spring 动态创建的缓存,称为动态缓存。并且这个缓存的 expireAfterAccess
和 expireAfterWrite
没有设置。因此,您放入其中的 1
永远不会被驱逐。
要获得预期的行为,您需要将 CaffeineCache
添加到缓存管理器。检查我的 answer。