Есть ли такая возможность, как сочетание возможностей Guava Cache
и Multimap
? По сути, мне нужна коллекция, в которой записи истекают по истечении заданного времени, например, доступны в Cache
, но у меня есть уникальные ключи, и мне нужно, чтобы записи истекали независимо.
Java Guava комбинация Multimap и Cache
Ответ 1
Я думаю, что Луис Вассерман дал ответ в одном из комментариев выше, то есть, что нет готового комбо 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;
}
У этого простого "решения" есть некоторые ограничения, но он работает нормально для меня.
Ответ 2
С помощью кэша Guava нет метода put, кеш предназначен для самозаполнения. Значения, возвращаемые из ключевого поиска, вычисляются во время выполнения. Аналогичный подход используется Commons Collections Transformer Factories.
Я думаю, что вы могли бы реализовать то, что ищете довольно легко. Если вы посмотрите на простой пример с поддержкой карты, например Kitty-Cache, вы увидите, что вы можете заменить карту на Multimap и переписать другие методы соответственно. Поэтому в KittyCache.java внутренне вы можете иметь что-то вроде:
Multimap<K, CacheEntry<V>> cache;
Трюк для такого типа кеша заключается в том, что ничего действительно не истекает, пока кто-то его не попросит.
Ответ 3
Пока вы говорите о Cache
, а не LoadingCache
, вы можете передать представление Cache.asMap()
в Multimaps.newMultimap
.