2011-09-21 52 views
2

我有一個WCF服務說 - 服務A,它根據他的personId返回一個人的名字。 從PersonId中檢索該人的姓名實際上是由另一個服務say-B提供的。ASP.Net |在哈希表或單個項目中緩存項目|需要建議

因此服務將人員ID傳遞給返回人員名稱的服務B.

現在我想要服務A只應該調用服務B如果服務B還沒有被調用personId。

所以我想實現緩存如下:

緩存的PERSONID,人名組合一旦我們從服務B. 檢索還我想提出一個基於時間扶養的個別項目。如果一個personId項目自1小時以來未訪問,則應該過期。

現在我有兩種方法

A)創建PERSONID和PERSONNAME的哈希表。每次有一個PersonID請求首先檢查personId是否存在於哈希中。如果是,則 - 然後從緩存中調用它,否則調用服務B.如果沒有,則調用服務B.將人員ID人員名稱組合添加到Hashtable,然後將該HashTable放入Cache中。

問題:我如何將依賴項放在單個項目上。依賴HashTable將不能解決這個問題B)緩存個人Personid和PersonName。每次有請求時,檢查Cache中是否存在PersonId。如果是從緩存服務,如果不是調用服務B.

問題:這將在緩存中引入大量項目。這會產生任何問題嗎?

我應該選擇哪種方法?

回答

0

你打算使用什麼樣的緩存框架?看看.NET 4的System.Runtime.Caching - 它應該解決你的困境。例如,你可以使用不同的緩存袋緩存人數:

private static ObjectCache personCache = new MemoryCache(); 

private Person Get(string id) 
{ 
    var p = personCache[id] as Person; 
    if (null == p) 
    { 
     // Make the service call to get the person 
     ... 
     // add to cache 
     personCache.Add(id, p, DateTime.Now.AddMinutes(30)); 
    } 
    return p; 
} 

對於以前版本的.NET,您可以使用Caching Application Block

+0

我正在使用企業庫緩存。 因此,您建議緩存每個personId,PersonName組合。 我的問題是,如果我有10到10k personIds在緩存中會有任何問題,如在內存泄漏等 – Gaurav

+0

@Gaurav,我建議使用特定的CacheManager進行緩存人員(例如'ICacheManager personCache = CacheFactory.GetCacheManager(「PersonsCache 「);')。這會將人員緩存存儲與其他緩存隔離並簡化管理 - 您不必擔心密鑰衝突,刷新此緩存不會影響其他緩存等。將許多項放入緩存不是問題 - 只會使用更多的內存。內存壓力可以通過減少緩存持續時間來減少,但增加緩存未命中的機會 - 您需要根據您的使用模式找到最佳持續時間。 – VinayC

+0

謝謝Vinay。標記爲答案 – Gaurav