[英]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用於內部地圖。 但是,我需要仔細檢查以獲取我認為效率低下的信息。
有什么建議嗎?
查看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.