2011-09-12 5 views
3

내 DataCache에서 두 개의 인덱스를 사용하여 개체를 캐시해야합니다. 여러 인덱스를 사용하는 ASP.NET 캐싱

내가이 같은 캐시 말 :

Campaign campaign = //get campaign from db 

HttpContext.Current.Cache.Add(
"Campaigns.Id."+campaign.Id.ToString(), 
campaign, 
null, 
System.Web.Caching.Cache.NoAbsoluteExpiration, 
System.Web.Caching.Cache.NoSlidingExpiration, 
System.Web.Caching.CacheItemPriority.Normal, 
null); 

HttpContext.Current.Cache.Insert("Campaigns.Code."+campaign.Code, 
campaign, 
null, 
System.Web.Caching.Cache.NoAbsoluteExpiration, 
System.Web.Caching.Cache.NoSlidingExpiration, 
System.Web.Caching.CacheItemPriority.Normal, 
null); 

내가 ID 또는 코드 "인덱스"를 사용하여 캐시에 액세스하려고합니다. 발견되지 않으면 위와 같이 캠페인을 검색하고 색인을 생성합니다.

이 방법으로 문제가 발생할 수 있습니까?

ASP는 인덱스 중 하나만 제거하도록 결정할 수 있습니다. 해당 인덱스를 통해 캐시에 액세스하면 항목을 가져오고 다시 색인을 다시 생성합니다.

UPDATE :

내 주요 질문은 내가 캐시에 저장되어있는 같은 객체에 불과 참조 객체를 두 번 저장하거나 경우에 지불 할 필요 여부?

답변

4

CacheDependency 개체를 사용하여 두 항목이 함께 제거되었는지 확인할 수 있습니다. 다음은 업데이트 된 insert 문입니다. 따라서 만료 시간이 더 이상 필요하지 않습니다.

HttpContext.Current.Cache.Insert(
    "Campaigns.Code." + campaign.Code, 
    campaign, 
    new CacheDependency(null, new [] {"Campaigns.Id."+campaign.Id.ToString()})); 

그러나 실제로 두 변종 모두 정상입니다.

편집 : 첫 번째 항목 추가 성공 여부에 따라 두 번째 항목을 삽입해야합니다. 여러 요청이 캐시에없는 개체를 요청하는 시나리오를 생각해보십시오. 전형적인 경주. 모두가 데이터를 작성하고 (잘), 그 중 하나는 Add(...) (괜찮음)으로 성공적으로 호출 할 수 있지만 모두 성공적으로 Insert(...) (좋지 않음)을 호출 할 수 있습니다. 두 개의 인덱스에 대해 반환되는 다른 객체로 끝날 수도 있습니다.

나는 코드에 다음과 같은 변경 사항을 제안 : 당신을 위해

Campaign campaign = //get campaign from db 
string id = "Campaigns.Id." + campaign.Id.ToString(); 
object old = HttpContext.Current.Cache.Add(
    id, campaign, null, 
    System.Web.Caching.Cache.NoAbsoluteExpiration, 
    System.Web.Caching.Cache.NoSlidingExpiration, 
    System.Web.Caching.CacheItemPriority.Normal, 
    null); 
if (old == null) { 
    // the object was successfully added 
    HttpContext.Current.Cache.Insert(
     "Campaigns.Code." + campaign.Code, 
     campaign, 
     new CacheDependency(null, new [] { id })); 
} 
+0

감사 입력합니다. 경쟁 조건을 피하기 위해 lock 문을 사용하고 있는데, 한 인덱스를 제거하고 다른 인덱스를 제거하지 않으면 큰 문제는 아닙니다. 내 주요 관심사는 두 번 객체를 저장하는 데 비용을 지불해야하는지 아니면 두 개의 색인 만 객체를 참조하는지 여부입니다. –

+1

@Niels 두 캐시 항목이 ** 같은 ** 개체 그래프 (위의 경쟁 조건 참조)를 가리키는 한, ** 하나의 ** 개체 만 유지합니다. 캐시 자체는 _reference_ 만 저장합니다. – Mark

+0

고마워요. 내가 찾던 고마워요. –