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

13
hgus1294 5 Мар 2012 в 16:23

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;
}

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

5
hgus1294 11 Мар 2012 в 14:14

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

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

Multimap<K, CacheEntry<V>> cache;

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

0
Mark McLaren 5 Мар 2012 в 13:02

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

0
fry 6 Мар 2012 в 15:00