Странное поведение для Spring кэша гуавы TTL конфиг

У меня есть следующий весенний кеш-конфиг:

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 ответ

Решение

Это потому, что Guava не гарантирует выселение значений автоматически по истечении времени ожидания.

Согласно документации здесь:

Кэши, созданные с помощью CacheBuilder, не выполняют очистку и высвобождают значения "автоматически", или сразу после истечения срока действия, или чего-либо подобного. Вместо этого он выполняет небольшие объемы обслуживания во время операций записи или во время периодических операций чтения, если записи выполняются редко.

Другие вопросы по тегам