2012-09-26 47 views
18

我正在尋求在WCF服務的請求級別實現緩存。對該服務的每個請求都會執行大量的數據庫調用。考慮多個數據收集器。我們需要允許一個數據收集器訪問已經由前面的數據收集器檢索到的信息。內存緩存或並行字典?

我正在尋找使用新的.net 4.0內存緩存爲此通過創建一個特定的實例每個請求。

這是個好主意嗎?或者我應該只使用一個Dictionary對象?

順便說一句:數據收集將是並行的,所以圍繞鎖定會有更多的複雜性,但我也可以使用併發收集。

+0

更新 - 我決定使用Concurrent集合,因爲這種模型我需要比系統級內存緩存更好。 –

+0

據我瞭解的MemoryCache類,它是一個進程級緩存.. – Legends

+0

甚至AppDomain級,尚未測試它。 – Legends

回答

25

如果你不需要某種過期邏輯,我會建議使用併發集合。你可以很容易地實現single entry caching mechanism結合ConcurrentDictionaryLazy類。這裏是關於Lazy和ConcurrentDictionary組合的another鏈接。

如果您需要您的項目過期,那麼您最好使用內置的MemoryCache並實施double-checked locking pattern以保證緩存項的單個檢索。準備去執行雙重檢查鎖定可以在Locking pattern for proper use of .NET MemoryCache

+0

好的 - 我在想同樣的觀點,但我仍然不明白「爲什麼?」的。 MemoryCache爲我提供了一些緩存特定功能,如AddOrGet。當我轉向併發集合時,我會失去它。 過期功能是在Concurrent Collection和MemoryCache之間進行選擇的唯一原因嗎? –

+1

@zync將ConcurrentDictionary與Lazy一起使用的想法是確保您爲每個應用程序域檢索一次緩存項,並且永不改變它們。如果這不是這種情況,MemoryCache更好。但是,如果您需要單一條目檢索邏輯,則使用ConcurrentDictionary更合適,因爲MemoryCache.AddOrGetExisting方法需要一個值,並且在檢索此值時仍然必須實現鎖定。但是,將ConcurrentDictionary.GetOrAdd(TKey鍵,Func valueFactory)與Lazy結合使用時,可以將所有鎖定的東西留給框架庫。 –

+3

順便說一句,如果您的緩存項目在服務啓動之前已經定義好了(例如,您沒有動態緩存),並且可以一次性緩存加載緩存中的所有數據,則可以使用服務類的靜態構造函數來加載緩存項。這樣更好,因爲靜態構造函數保證在每個應用程序域中執行一次,並且在執行該類型的任何實例構造函數之前執行。很簡單。 –