2011-09-21 50 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