Guava CacheBuilder не вызывает removeListener сразу после истечения срока действия кэша - PullRequest
0 голосов
/ 25 января 2019

Из журналов моего приложения я чувствую, что removeListener не вызывается сразу после истечения срока действия ключа кэша.Это создает проблему в следующем сценарии

Конфигурация кэша:

SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
GuavaCache cache = new GuavaCache("cacheData", CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.MINUTES).removalListener(expiredCacheListener()).build());

В логике приложения я вижу, что когда вызывается cache.get(key), тогда, если нет значения (потому чтосрок действия кэша истек из-за ограничения по времени expireAfterAccess() метода), затем он помещает новое значение в кэш для того же ключа, поскольку старый ключ истек / удален.

После этой операции записи, то сразу же, я думаю,что RemovalListener вызывает метод expiredCacheListener(), который имеет логику изменения значения для ключа с истекшим сроком действия .... // Но на самом деле это изменение нового значения !!!

Теперь у меня есть действительныйключ с неверным значением в кэше

Если поток может сделать ключ с истекшим сроком действия, то не должен ли тот же поток немедленно вызывать removeListener?Как я могу решить это?

1 Ответ

0 голосов
/ 25 января 2019

Вот как работает Guava Cache, см. CachesExplained :

Когда происходит очистка?

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

Узнайте больше, чтобы создатели Guava "поставили выбор в свои руки", и выВы можете самостоятельно поддерживать потоки clueanup.

Для более сложных Cache вариантов использования используйте Caffeine , который "обеспечивает кэш в памяти с помощью API, основанного на Google Guava". Removal На вики-странице упоминается, что для слушателей синхронного удаления вы можете использовать CacheWriter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...