如何解决咖啡因缓存在 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++));
实际结果:
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。