Java Guava combination of Multimap and Cache

可紊 提交于 2019-12-05 13:11:42

问题


Is there any such thing as a combination of Guava's Cache and Multimap functionality available? Essentially, I need a collection where entries expire after a given time such as available in Cache but I have non-unique keys and I need the entries to expire independently.


回答1:


I think that Louis Wasserman provided the answer in one of the comments above, i.e. that there is no off-the-shelf combo of Multimap and Cache available. I have solved my problem/requirements with the solution outlined in pseudo-code below:

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

This simple 'solution' has some limitations but it works OK for me.




回答2:


With a Guava Cache there is no put method, the cache is designed to be self-populating. The values returned from a key lookup are calculated at runtime. A similar approach is taken by Commons Collections Transformer Factories.

I think you could implement what you are looking for quite easily. If you look at a simple Map backed example such as Kitty-Cache you can see that you could replace the Map with a Multimap and rewrite the other methods accordingly. So in KittyCache.java internally you could have something like:

Multimap<K, CacheEntry<V>> cache;

The trick for this kind of cache is that nothing really expires until someone requests it.




回答3:


As long as you're talking about Cache and not LoadingCache you could pass the Cache.asMap() view into Multimaps.newMultimap.



来源:https://stackoverflow.com/questions/9566568/java-guava-combination-of-multimap-and-cache

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!