2011-09-21 2 views
2

나는 그의 personId를 기반으로 한 사람의 이름을 반환하는 WCF 서비스 say- Service A를 가지고있다. PersonId에서 사람 이름을 검색하는 것은 실제로 다른 서비스 say -B에 의해 제공됩니다.ASP.Net | 해시 테이블 또는 개별 항목의 항목 캐시 | Needs suggestions

그래서 서비스 A는 사람 B를 서비스하는 사람에게 사람 이름을 반환합니다.

이제는 서비스 B가 personId에 대해 호출되지 않은 경우에만 서비스 A가 서비스 B를 호출해야합니다.

캐시 우리가 서비스 B. 에서를 검색 한 후에는 personid, 사람 이름의 조합은 또한 나는 개별 항목을 한 번에 기반 의존성을 데려 가고 싶다는 다음과 같이

그래서 내가 캐싱을 구현하고자합니다. 개별 personId 항목이 1 시간 이후에 액세스하지 않은 경우 만료되어야합니다.

는 지금은 두 가지 방법

A)를 personid 및 PERSONNAME의 해시 테이블을 만들고 있습니다. personID가 해시에 존재하는지 먼저 확인해야합니다. 캐시 ID가없는 경우 Cache B. 다른 사람이 전화 서비스 B에서 서비스를 제공합니다. Hashtable을 만든 다음이 HashTable을 캐시에 넣습니다.

문제점 : 개별 항목에 종속성을 어떻게 두어야합니까? HashTable에 의존 관계를 설정해도이 문제가 해결되지 않습니다.

B) 개인 Personid와 PersonName을 캐시하십시오. 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 조합을 캐싱하는 것이 좋습니다. 나는 (명 캐싱에 대한 특정 CacheManager를 사용하도록 추천하고 나는 그것을 메모리 누수 등 – Gaurav

+0

@Gaurav에서 같은 문제가 될 것입니다 캐시에 10-20k personIds이있는 경우 내 관심사입니다 예를 들어'ICacheManager personCache = CacheFactory.GetCacheManager ("PersonsCache ");). 이것은 다른 캐시에서 사람 캐시 저장소를 분리하고 관리를 단순화합니다 - 당신은 키 충돌에 대해 걱정할 필요가 없습니다,이 캐시를 플러시하는 것은 문제가되지 않습니다 캐시에 많은 항목을 넣는 등 캐시 다른 영향을 미치지 않습니다 - 단지 더 많은 메모리를 사용합니다. 메모리 압력이 캐시 기간을 줄일 수 있지만, 캐시 미스의 기회를 증가시킴으로써 감소 될 수있다 - u는 당신의 사용 패턴에 따라 최적의 기간을 찾아야합니다. – VinayC

+0

감사합니다. Vinay. 답변으로 표시 함 – Gaurav

관련 문제