簡體   English   中英

在Java中使用多個使用者和單個生產者實現緩存

[英]Implementing cache with multiple consumer and single producer in java

我的要求是維護一個固定大小的緩存,以便在基於Java的Web應用程序中為多個使用者和單個生產者提供支持。 我的數據是這樣的:

鍵1,鍵2,值

123,abc,列表1

123,def,List2

234,xyz,List3

客戶或消費者將基於key1和key2查詢此緩存。 因此,如果多個使用者嘗試同時訪問同一key1和2的緩存,則他們都應從緩存中獲取相同的數據作為響應。

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

我目前在地圖內使用地圖。 即,鍵1用於外部地圖,鍵2用於內部地圖。 但是,我需要仔細檢查以獲取我認為效率低下的信息。

有什么建議嗎?

首先,我將您的緩存擴展為單個2組件鍵(即將key1和key2組合為復合鍵類)。

其次,我將使用現有的緩存實現方式,而不是重新發明輪子。 對於“簡單”用法,您可以同步對LinkedHashMap的訪問(可以使用removeEldestEntry()方法來限制訪問大小)。 如果您需要更復雜的線程處理,那么我會看一下ehcacheGuava之類的東西(在其他答案中提到)。

查看Guava ,這是Google有用的實用程序庫,其中包含一些出色的緩存功能。 特別是,它支持最大大小,並將自動處理逐出。

至於2鍵問題,為什么不將Guava緩存(或任何實現)包裝到另一個使用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
        }
    }
}

我建議使用自定義Map實現以所需的大小ConcurrentHashMap (負載因子為1)進行備份,並在其中包含一個計數器,以確保包裝的ConcurrentHashMap包含的內容不超過所需的范圍。

您可以為兩個鍵維護兩個ConcurrentHashMaps,如果沒有沖突的機會,則可以維護一個。 要記住最舊的鍵,您可以維護一個隊列,其中包含兩個最舊的鍵,以便在達到高速緩存大小限制時將其刪除。

暫無
暫無

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

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