2012-12-14 57 views
0

我的需求是維護一個固定大小的緩存,它爲基於java的web應用程序中的多個消費者和單個生產者提供支持。我的數據是這樣的:在java中實現與多個消費者和單個生產者的緩存

鍵1,鍵2,價值觀

123,ABC,列表1

123,閃避,列表2

234,XYZ,項目list3

客戶或消費者將根據key1和key2查詢該緩存。 因此,如果多個消費者嘗試同時訪問相同密鑰的緩存,他們都應該從緩存中獲取相同的數據作爲響應。

我在尋找最好的數據結構來使用。 另請注意,緩存大小是固定的,因此如果生產者在嘗試插入記錄之前應該在緩存已滿時刪除第一個元素。

我目前在地圖中使用地圖。即鍵1用於外部地圖,鍵2用於內部地圖。不過,我需要仔細觀察才能獲得我認爲效率低下的信息。

有什麼建議嗎?

回答

1

首先,我會將你的緩存壓扁成一個單一的2分量密鑰(即將key1和key2組合成一個複合密鑰類)。

其次,我會使用現有的緩存實現,而不是重新發明輪子。對於「簡單」使用,您可以同步對LinkedHashMap的訪問(您可以使用removeEldestEntry()方法按大小進行限制)。如果你需要更復雜的線程處理,那麼我會看看類似ehcacheGuava(在其他答案中提到)。

+0

感謝您對所有人的迴應......我看着番石榴,但驅逐過程並不適合我們。因爲我們需要根據規模驅逐,但不是所有東西,而只是最早的記錄。另外我應該在我的第二把鑰匙上澄清。我需要的值的方式是鍵2>輸入鍵。用戶將提供輸入鍵1和輸入鍵2.但返回的值應等於輸入鍵1並大於輸入鍵2。 – user1712512

0

檢出Guava,Google提供的一個有用的實用程序庫,它包含一些很棒的緩存功能。特別是,它支持最大尺寸,並自動處理驅逐。

對於2個鍵問題,爲什麼不與其它類,它的2個鍵和組合生成一個密鑰,如包裹番石榴緩存(或任何執行):

public class MyCache<Key, Value> { 
    private final Cache<CacheKey, Value> guavaCache = CacheBuilder.build() 

    public void put(Key keyOne, Key keyTwo, Value value) { 
     cache.put(new CacheKey(keyOne, keyTwo), value); 
    } 

    public Value get(Key keyOne, Key keyTwo) { 
     return cache.getIfPresent(new CacheKey(keyOne, keyTwo)); 
    } 

    private static final class CacheKey { 
     private final Key keyOne; 
     private final Key keyTwo; 

     CacheKey(Key keyOne, Key keyTwo) { 
      this.keyOne = keyOne; 
      this.keyTwo = keyTwo; 
     } 

     @Override 
     public int hashCode() { 
      int hash = keyOne == null ? 0 : keyOne.hashCode(); 
      return hash + 31 * keyTwo == null ? 0 : keyTwo.hashCode(); 
     } 

     @Override 
     public boolean equals(Object o) { 
      // implementation omitted 
     } 
    } 
} 
0

我建議自定義Map實現備份與負載因子1所需的大小ConcurrentHashMap並有一個櫃檯裏面,以確保您包裝ConcurrentHashMap不包含超過你想要它包含。

0

您可以爲兩個鍵維護兩個ConcurrentHashMaps,或者如果沒有衝突的機會,可以維護兩個ConcurrentHashMaps。要記住最舊的密鑰,您可以在達到緩存大小限制時使用兩個最舊的密鑰來維護一個隊列,以便將其刪除。

相關問題