Spring缓存番石榴TTL配置的奇怪行为

时间:2016-07-01 10:07:17

标签: spring spring-boot guava spring-cache google-guava-cache

我有以下弹簧缓存配置:

spring.cache.guava.spec: expireAfterWrite=1s

然后我测试了它:

@Test
public void test_not_work() {
  callCachedMethod(..);
  sleep(2s);
  callCachedMethod(..);

  expect("real method called TWO times"); 
  // because cache should be expired after 1s
  // It DOESN'T work, real method only called once
}

@Test
public void test_works() {
  callCachedMethod(..);
  sleep(2s);
  callCachedMethod(..);
  sleep(2s);
  callCachedMethod(..);

  expect("real method called THREE times"); 
  // because cache should be expired after 1s
  // IT WORKS!!
}

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

这是因为当超时值到期时,Guava无法确保自动驱逐值。

根据其文档here

  

使用CacheBuilder构建的缓存不执行清理并逐出值   "自动"或者在价值到期后立即或任何其他东西   那种。相反,它在执行期间执行少量维护   写入操作,或者在写入时偶尔进行读取操作   罕见的。