Java Guava комбинация Multimap и Cache - PullRequest
13 голосов
/ 05 марта 2012

Есть ли такая комбинация функций Cache и Multimap в Гуаве? По сути, мне нужна коллекция, в которой срок действия записей истекает через определенное время, например, доступная в Cache, но у меня есть неуникальные ключи, и мне нужно, чтобы срок действия записей истек независимо.

Ответы [ 3 ]

5 голосов
/ 11 марта 2012

Я думаю, что Луи Вассерман предоставил ответ в одном из комментариев выше, то есть, что нет готовых комбо 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;
}

Это простое «решение» имеет некоторые ограничения, но оно работает для меня нормально.

0 голосов
/ 06 марта 2012

Пока вы говорите о Cache, а не LoadingCache, вы можете передать Cache.asMap() представление в Multimaps.newMultimap.

0 голосов
/ 05 марта 2012

При использовании кеша Guava метод put отсутствует, кеш предназначен для самостоятельного заполнения.Значения, возвращаемые при поиске ключа, рассчитываются во время выполнения.Аналогичный подход используется фабриками трансформаторов Commons Collections.

Я думаю, вы могли бы легко реализовать то, что искали.Если вы посмотрите на простой пример с поддержкой Map, такой как Kitty-Cache , вы увидите, что вы можете заменить Map на Multimap и переписать другие методы соответственно.Поэтому в KittyCache.java внутренне вы можете получить что-то вроде:

Multimap<K, CacheEntry<V>> cache;

Хитрость для такого рода кеша заключается в том, что ничего не истекает, пока кто-то не запросит его.

...