Из журналов моего приложения я чувствую, что 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?Как я могу решить это?