0

我有以下弹簧缓存配置:

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!!
}

有人可以解释一下吗?

4

1 回答 1

1

这是因为 Guava 并不能确保在超时值到期时自动驱逐这些值。

根据其文档here

使用 CacheBuilder 构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行,或任何类似的操作。相反,它在写入操作期间执行少量维护,或者如果写入很少,则在偶尔的读取操作期间执行。

于 2016-09-25T23:59:01.140 回答