Google guava LoadingCache: когда следует вызывать cache.cleanup()

Я использую LoadingCache в своем проекте. Я настроил RemovalListener и CahceLoader для кеша.

    LoadingCache<Key, value> cache = cache = (LoadingCache<Key, value>) CacheBuilder
            .newBuilder().initialCapacity(50).maximumSize(500).expireAfterAccess(4, HOURS)
            .removalListener(new RemovalHander())
            .build(new CacheLoader<Key, value>() {
                @Override
                public Value load(Key request) {
                    return loadCache(request);
                }

            });

Я столкнулся с проблемой параллелизма с этим кешем в следующем сценарии:

  • По запросу Key1 кэш заполняется Value1
  • Доступ к кешу для Key1 не осуществляется в течение следующих 4 часов
  • По прошествии 4 часов Key1 помечается как просроченный
  • Через 4 часа приходит запрос на доступ к Key1
  • По запросу Key1(получено в поток запросов) через 4 часов, LoadingCache находит Key1 истекшим, поэтому инициирует новый поток (вызов тема очистки) выполняет очистку кеша для Key1, а запрос- нить пытается загрузить свежие данные для Key1.
  • Поскольку обе операции удаления/выборки выполняются для одного и того же ключа, т. е. Key1, поток запросов обнаруживает, что запись уже существует, а поток очистки удаляет данные.

Короче говоря, RemovalHander соревнуется с CacheLoader для Key1. Я хочу избежать вышеуказанного случая и думаю вызвать cleanup() метод LoadingCache.

Не могли бы вы подсказать по следующим пунктам:

  1. Когда следует вызывать метод cleanup()? Периодически используя какой-то ПланировщикСервис или при каждом запросе записи в кеш?
  2. Есть ли лучший способ решить вышеуказанную проблему?
  3. Является ли их лучшей заменой GuavaCache?

Это неясно, но звучит так, как будто вы говорите, что RemovalHander соревнуется с CacheLoader, чтобы увидеть какое-то общее состояние. Если вам нужно, чтобы обработчик удаления вызывался синхронно перед загрузкой, вы можете использовать CacheWriter Caffeine. Что касается cleanUp, он в основном предназначен для тестирования или должен вызываться периодически, но не исправит гонку, если это основная проблема.

Ben Manes 19.03.2019 08:14

Спасибо, обновленный пост, чтобы сделать его более понятным.

G.G. 19.03.2019 08:37

Обычно с гонкой все в порядке, но если нет, то вам придется как-то справиться с гонкой или подумать о переходе на кофеин.

Ben Manes 19.03.2019 08:40

Вы говорите, что кеш возвращает просроченные данные? Это звучит не так...

shmosel 19.03.2019 08:43

@shmosel Я думаю, ему нужно, чтобы прослушиватель удаления завершился до запуска загрузчика, что не поддерживается Guava.

Ben Manes 19.03.2019 08:48

Что делает RemovalHandler?

shmosel 19.03.2019 08:49

@Ben Manes Вы правильно поняли мой вопрос. Вы предлагаете использовать кофеин, но я прочитал его документацию, и политика очистки выглядит полностью похожей на кеш Guava: github.com/ben-manes/caffeine/wiki/Очистка Кстати, я только что заметил, что вы тот же Бен, который работал над разработкой кофеина. :)

G.G. 19.03.2019 09:06

@shmosel: RemovalHandler выполняет некоторую очистку, например. закрытие открытой подписки, откуда я получаю данные для заполнения кеша.

G.G. 19.03.2019 09:07

Я также работал над Guava, поэтому знаю его ограничения ?. Вы должны посмотреть на github.com/ben-manes/caffeine/wiki/Писатель

Ben Manes 19.03.2019 09:07

@Ben Manes: Круто, спасибо. Посмотрю кофеин :)

G.G. 19.03.2019 09:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
10
547
0

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