Java Guava组合Multimap和Cache

时间:2012-03-05 12:23:13

标签: java guava multimap

是否有可用的番石榴CacheMultimap功能组合?基本上,我需要一个集合,其中条目在给定时间后过期,例如Cache中可用,但我有非唯一键,我需要条目独立到期。

3 个答案:

答案 0 :(得分:5)

我认为Louis Wasserman在上面的一条评论中提供了答案,即没有MultimapCache可用的现成组合。我已用下面的伪代码中概述的解决方案解决了我的问题/要求:

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

这个简单的“解决方案”有一些限制,但它对我来说没问题。

答案 1 :(得分:0)

使用Guava Cache没有 put 方法,缓存设计为自填充。从键查找返回的值是在运行时计算的。 Commons Collections Transformer Factories采用了类似的方法。

我认为你可以很容易地实现你想要的东西。如果您查看一个简单的Map支持示例,例如Kitty-Cache,您可以看到可以用Multimap替换Map并相应地重写其他方法。所以在KittyCache.java内部你可以有类似的东西:

Multimap<K, CacheEntry<V>> cache;

这种缓存的技巧是在有人请求之前没有真正到期。

答案 2 :(得分:0)

只要您谈论Cache而非LoadingCache,就可以将Cache.asMap()视图传递给Multimaps.newMultimap