2013-11-28 29 views
1

我正在開發一個使用Jersey的RESTful Web服務,我將使用一個簡單的對象緩存,通過基於計時器從數據庫中檢索記錄來更新它的數據。我打算使用HashMap將檢索到的數據存儲在此緩存中,但我的問題是更新此HashMap的最佳做法。更新對象緩存的HashMap的最佳實踐

現在我的選擇是讓HashMap變得易變,隨時更新進來,創建一個新的HashMap,然後在完成時分配它。我也可以將HashMap包裝在一個同步塊中,或直接更新HashMap變量時使用ReentrantReadWriteLock。我也想過使用ConcurrentHashMap,它似乎有一些性能優勢。使用其中一種方法比其他方法有什麼顯着的性能差異和/或缺點?

此外,當用戶通過我的Web服務API更新或插入記錄時,最佳做法是在將記錄保存在數據庫中或強制緩存執行另一個大數據檢索後,直接更新本地緩存?

回答

0

使用ConcurrentLinkedHasHMap,它使用LIRS算法。

ConcurrentLinkedHashMap實現最初是由Doug Lea的編碼和OpenJDK的1.6.0_0發現ConcurrentHashMap實現的扭捏版本。我們提出了ConcurrentMap接口的併發哈希映射和鏈表實現,並且具有可預測的迭代順序。這個實現與ConcurrentHashMap的不同之處在於它維護一個雙向鏈表,它在所有條目中運行。這個鏈表定義了迭代排序,這通常是鍵被插入映射的順序(插入順序)。請注意,如果將鍵重新插入到地圖中,則插入順序不受影響。

2

而不是HashMap,考慮使用Guava'的緩存,這是更可配置和記錄您的意圖緩存數據。閱讀this的例子。

+0

閱讀的例子,但我不知道的性能優勢,因爲我還總是對DB新的數據讀取讀取每分鐘左右。我通過API返回整個列表(認爲事件日曆),您提到的示例是用於緩存特定值。 – Justin