Доступна ли такая вещь, как комбинация функций Guava Cache
и Multimap
? По сути, мне нужна коллекция, в которой записи истекают по истечении заданного времени, например, доступны в Cache
, но у меня есть неуникальные ключи, и мне нужно, чтобы записи истекали независимо.
3 ответа
Я думаю, что Луи Вассерман дал ответ в одном из приведенных выше комментариев, т.е. что готовой комбинации Multimap
и Cache
не существует. Я решил свою проблему / требования с помощью решения, описанного в псевдокоде ниже:
private Cache<Integer,Object> cache = CacheBuilder.newBuilder().SomeConfig.build();
private Multimap<Integer,Object> multimap = HashMultimap<Integer, Object>.create();
private AtomicInteger atomicid = new AtomicInteger(0);
public void putInMultimap(int id, Object obj) {
int mapid = atomicid.addAndGet(1);
cache.put(mapid,obj);
multimap.put(id,mapid);
}
public List<Object> getFromMultimap(int id) {
Set<Integer> mapids = multimap.get(id);
List<Object> list = new ArrayList<Object>();
for (int i : mapids) {
list.add(cache.getIfPresent(i));
}
return list;
}
Это простое «решение» имеет некоторые ограничения, но мне оно подходит.
В кэше Guava нет метода put , кеш спроектирован так, чтобы заполняться самостоятельно. Значения, возвращаемые при поиске ключей, вычисляются во время выполнения. Похожий подход используется фабриками трансформаторов коллекций Commons.
Я думаю, вы могли бы довольно легко реализовать то, что ищете. Если вы посмотрите на простой пример с поддержкой карты, такой как Kitty-Cache, вы увидите, что вы можете заменить карту Multimap и соответствующим образом переписать другие методы. Итак, в KittyCache.java внутри у вас может быть что-то вроде:
Multimap<K, CacheEntry<V>> cache;
Уловка для такого типа кеша заключается в том, что на самом деле ничто не истекает, пока кто-то его не запросит.
Пока вы говорите о Cache
, а не о LoadingCache
, вы можете передать представление Cache.asMap()
в Multimaps.newMultimap
.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].