Guava cache 'expireAfterWrite', кажется, не всегда работает
private Cache<Long, Response> responseCache = CacheBuilder.newBuilder()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
Я ожидаю, что объекты ответа, которые не отправляются клиенту в течение 10 минут, истекают и удаляются из кэша автоматически, но я замечаю, что объекты ответа не всегда истекают даже через 10, 15, 20 минут. Они действительно истекают, когда кэш заполняется в большом количестве, но когда система простаивает, что-то вроде последних 500 объектов ответа, она перестает удалять эти объекты.
Может ли кто-то помочь понять это поведение? Спасибо
1 ответ:
Это указано в документах:
Если запрашивается expireAfterWrite или expireAfterAccess, записи могут быть удалены при каждой модификации кэша, при случайных обращениях к кэшу или при вызовах кэша.очистка(). Просроченные записи могут быть подсчитаны кэшем.size (), но никогда не будет виден для операций чтения или записи.
И есть более подробная информация на вики:
Кэши, построенные с помощью CacheBuilder, не выполняют очистку и не удаляют значения "автоматически" или мгновенно после истечения срока действия значения или чего-то в этом роде. Вместо этого он выполняет небольшие объемы обслуживания во время операций записи или во время случайных операций чтения, если записи редки.
Причина этого заключается в следующем: если бы мы хотели выполнить кэширование обслуживание непрерывно, мы должны были бы создать поток, и его операции будут конкурировать с операциями пользователей за общие блокировки. Кроме того, некоторые среды ограничивают создание потоков, что бы сделать CacheBuilder непригоден для использования в этой среде.
Вместо этого мы передаем выбор в ваши руки. Если ваш кэш является высокая пропускная способность, то вам не нужно беспокоиться о выполнении кэша техническое обслуживание для очистки просроченных записей и тому подобное. Если ваш кэш does пишет только редко, и вы не хотите, чтобы очистка блокировала кэш читает, вы можете создать свой собственный поток обслуживания, который вызывает Кэш.очистка () через регулярные промежутки времени.
Если вы хотите запланировать регулярный кэш обслуживание для кэша, который только изредка пишет, просто график технического обслуживания используя Scheduledexecutorservice выполняет.
Comments