咖啡因缓存在 expireAfterAccess/expireAfterWrite 后未被逐出
caffeine Cache is not evicted after expireAfterAccess/expireAfterWrite
我的配置:
@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
我做错了什么?
如何修复?
仅供参考,CaffeineCacheManager
和 CaffeineCache
是真正 Caffeine 缓存的 Spring 包装器。
org.springframework.cache.caffeine
.CaffeineCache
实现 org.springframework.cache
.Cache
(强调在两者的包装上)
关于您的问题,从您的 @Bean
返回的 CaffeineCacheManager
实际上有 NO 个缓存。所以当你调用 cacheManager.getCache("test_cache")
时,你会得到一个由 Spring 动态创建的缓存,称为动态缓存。而这个缓存的 expireAfterAccess
和 expireAfterWrite
没有设置。因此,您放入其中的 1
永远不会被驱逐。
要获得预期的行为,您需要将 CaffeineCache
添加到缓存管理器。检查我的 .
我的配置:
@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
我做错了什么?
如何修复?
仅供参考,CaffeineCacheManager
和 CaffeineCache
是真正 Caffeine 缓存的 Spring 包装器。
org.springframework.cache.caffeine
.CaffeineCache
实现 org.springframework.cache
.Cache
(强调在两者的包装上)
关于您的问题,从您的 @Bean
返回的 CaffeineCacheManager
实际上有 NO 个缓存。所以当你调用 cacheManager.getCache("test_cache")
时,你会得到一个由 Spring 动态创建的缓存,称为动态缓存。而这个缓存的 expireAfterAccess
和 expireAfterWrite
没有设置。因此,您放入其中的 1
永远不会被驱逐。
要获得预期的行为,您需要将 CaffeineCache
添加到缓存管理器。检查我的