咖啡因缓存在 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...