簡體   English   中英

Java Guava組合Multimap和Cache

[英]Java Guava combination of Multimap and Cache

是否有可用的組合Guava的CacheMultimap功能? 本質上,我需要一個集合,其中條目在給定時間后過期,例如在Cache可用,但我有非唯一鍵,我需要條目獨立到期。

我認為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;
}

這個簡單的“解決方案”有一些限制,但它對我來說沒問題。

使用Guava Cache沒有put方法,緩存設計為自填充。 從鍵查找返回的值是在運行時計算的。 Commons Collections Transformer Factories采用了類似的方法。

我認為你可以很容易地實現你正在尋找的東西。 如果您查看一個簡單的Map支持示例(如Kitty-Cache),您可以看到可以用Multimap替換Map並相應地重寫其他方法。 所以在KittyCache.java內部你可以有類似的東西:

Multimap<K, CacheEntry<V>> cache;

這種緩存的技巧是在有人請求它之前沒有真正到期。

只要您談論Cache而不是LoadingCache ,就可以將Cache.asMap()視圖傳遞給Multimaps.newMultimap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM