Java Guava组合Multimap和Cache

是否有可用的组合Guava的CacheMultimapfunction? 本质上,我需要一个集合,其中条目在给定时间后到期,例如在Cache可用,但我有非唯一键,我需要条目独立到期。

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

 private Cache cache = CacheBuilder.newBuilder().SomeConfig.build(); private Multimap multimap = HashMultimap.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 getFromMultimap(int id) { Set mapids = multimap.get(id); List list = new ArrayList(); for (int i : mapids) { list.add(cache.getIfPresent(i)); } return list; } 

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

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

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

 Multimap> cache; 

这种缓存的诀窍是,在有人请求之前,没有任何东西真正到期。

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