微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

咖啡因缓存在 expireAfterAccess/expireAfterWrite 后不会被驱逐

如何解决咖啡因缓存在 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

我做错了什么?

如何解决

解决方法

仅供参考,CaffeineCacheManagerCaffeineCache 是围绕真正 Caffeine 缓存的 Spring 包装器。

org.springframework.cache.caffeine.CaffeineCache 实现了 org.springframework.cache.Cache(强调两者的包)

至于您的问题,从您的 CaffeineCacheManager 返回的 @Bean 实际上没有缓存。因此,当您调用 cacheManager.getCache("test_cache") 时,您将获得 Spring 动态创建的缓存,称为动态缓存。并且这个缓存的 expireAfterAccessexpireAfterWrite 没有设置。因此,您放入其中的 1 永远不会被驱逐。

要获得预期的行为,您需要将 CaffeineCache 添加到缓存管理器。检查我的 answer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。