Я использую 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);
}
});
Я столкнулся с проблемой параллелизма с этим кешем в следующем сценарии:
Короче говоря, RemovalHander соревнуется с CacheLoader для Key1.
Я хочу избежать вышеуказанного случая и думаю вызвать cleanup() метод LoadingCache.
Не могли бы вы подсказать по следующим пунктам:
Спасибо, обновленный пост, чтобы сделать его более понятным.
Обычно с гонкой все в порядке, но если нет, то вам придется как-то справиться с гонкой или подумать о переходе на кофеин.
Вы говорите, что кеш возвращает просроченные данные? Это звучит не так...
@shmosel Я думаю, ему нужно, чтобы прослушиватель удаления завершился до запуска загрузчика, что не поддерживается Guava.
Что делает RemovalHandler?
@Ben Manes Вы правильно поняли мой вопрос. Вы предлагаете использовать кофеин, но я прочитал его документацию, и политика очистки выглядит полностью похожей на кеш Guava: github.com/ben-manes/caffeine/wiki/Очистка Кстати, я только что заметил, что вы тот же Бен, который работал над разработкой кофеина. :)
@shmosel: RemovalHandler выполняет некоторую очистку, например. закрытие открытой подписки, откуда я получаю данные для заполнения кеша.
Я также работал над Guava, поэтому знаю его ограничения ?. Вы должны посмотреть на github.com/ben-manes/caffeine/wiki/Писатель
@Ben Manes: Круто, спасибо. Посмотрю кофеин :)




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