【问题标题】:Strange Behavior for Spring cache guava TTL configSpring缓存番石榴TTL配置的奇怪行为
【发布时间】:2016-11-03 16:51:53
【问题描述】:

我有以下 spring 缓存配置:

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

谁能解释一下?

【问题讨论】:

  • 一方面,你确定 Guava 真的被使用了吗?与其粘贴我们没有机会运行的测试,不如分享一个重现问题的项目。这将更容易解释发生了什么。
  • 请多解释问题,你不写问题

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


【解决方案1】:

这是因为 Guava 不保证在超时值到期时自动驱逐值。

根据其文档here

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

【讨论】:

  • 谢谢,它解释了很多,但是为什么它可以与缓存方法的 3 次调用一起工作..
  • @Jaiwo99 在这种情况下它恰好按您的预期工作。你不应该依赖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
相关资源
最近更新 更多