Странное поведение для 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, не выполняют очистку и высвобождают значения "автоматически", или сразу после истечения срока действия, или чего-либо подобного. Вместо этого он выполняет небольшие объемы обслуживания во время операций записи или во время периодических операций чтения, если записи выполняются редко.