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

我做错了什么?

如何修复?

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

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

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

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