2010-01-14 80 views
3

相關使用情況:緩存和計算映射

read input 

if (correlation-id is already generated for this input) 
{ 
    lookup the correlation-id from the cache; 
    return correlation-id; 
} 

else 
{ 
    generate the correlation-id; 
    cache it; 
    return correlation-id; 
} 

約束: - 輸入記錄的數量可以去,直到500K因此不希望使用 強引用。 - 不希望產生一個單向哈希截至目前(我知道,如果我們 使用單向散列那麼就沒有必要緩存)

有人能告訴我如何使用ComputingMap這一點。我在問這個 ,因爲javadoc中有一個註釋說「它使用弱/軟按鍵的等同性 」。

+0

什麼類型的對象是你的鑰匙和價值觀? – 2010-01-15 00:08:57

+0

現在的關鍵是一個Tuple對象(正確覆蓋equals和hasCode)。你爲什麼問?是基於我用於鍵的輸入類型的用法。 該值始終是一個字符串 – 2010-01-15 00:13:15

+0

那麼,就您而言,我不確定弱或弱的引用有多大意義。無論您的特定元組或id字符串是否發生垃圾收集,似乎都與您是否希望條目在緩存中被認爲是陳舊的無關。您可以考慮使用過期時間(例如'.expiration(10,TimeUnit.MINUTES)')。將來你可以指定一個大小上限。 – 2010-01-15 21:16:56

回答

3

使用Google Guava/Collection類和軟鍵或弱鍵或值,您的鍵需要是強大的引用,以便使用equals()而不是==來查找緩存的值。如果你有弱/軟鍵,那麼查找是以身份完成的,所以你總會得到一個緩存未命中。所以如果你想讓垃圾收集器從你的緩存中獲取GC項目,那麼你需要使這些值變軟或變弱。

我知道Google會在將來添加等效功能,以便您可以聲明是否需要equals()或==,而不是通過選擇強,弱或軟引用爲您做出此選擇。

由於你的元組對象實現equals()和hashCode()方法,那麼你只是做

new MapMaker() 
    .softValues() 
    .makeComputingMap(new Function<Tuple,String>() { 
             public String apply(Tuple t) { 
              // generate the correlation-id 
             } 
            }); 
+0

所以你建議有強大的鍵和軟值。強關鍵becaz我想使用等於()和軟值來利用內存efiicieny ... 但我仍然不明白爲什麼身份相等被默認使用。有人可以請解釋 – 2010-01-15 01:25:11

+0

是的。這是Google MapMaker的一個缺點,您無法選擇等效性測試:strong => equals,weak或soft => ==。我知道他們正在努力。 您可以使用JDK併發組中的extra166y並使用其CustomConcurrentHashMap。它提供了可以使用的其他等效功能。 使用extra166y的一個缺點是它不會在Web應用程序上下文中卸載自身,也無法停止收集線程。 http://gee.cs.oswego.edu/dl/concurrency-interest/ – 2010-01-15 05:24:03

+0

這不是缺點。這是功能。他們說一張軟/弱鍵的地圖是錯誤的。查看Joshua對關於Google Collections的視頻的評論。並不難刪除該功能並使用等號後退。您可以在本文底部看到我的修改後的'MapMaker.jar':http://satukubik.com/2009/11/13/computing-map-on-google-collections/ – nanda 2010-01-15 05:50:23