2009-04-01 8 views
11

특정 접두어로 ASP.NET 캐시에 항목을 추가하고 있습니다. 캐시를 반복하고 해당 항목을 제거 할 수 있기를 바랍니다. 캐시에서 특정 항목 제거 (ASP.NET)

foreach (DictionaryEntry CachedItem in Cache) 
    { 
     string CacheKey = CachedItem.Key.ToString(); 
     if(CacheKey.StartsWith(CACHE_PREFIX){ 
      Cache.Remove(CacheKey); 
     } 
    } 

가 좀 더 효율적으로이 일을 할 수 없습니다 : 내가 할 시도한

방법은 그렇게처럼?

임시 파일을 만들고 해당 파일에 의존성이있는 항목을 추가 한 다음 파일을 삭제하는 것으로 생각했습니다. 그건 끝났어?

답변

19

당신은 컬렉션에서 항목을 제거 할 수 없습니다 :

List<string> itemsToRemove = new List<string>(); 

IDictionaryEnumerator enumerator = Cache.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    if (enumerator.Key.ToString().ToLower().StartsWith(prefix)) 
    { 
     itemsToRemove.Add(enumerator.Key.ToString()); 
    } 
} 

foreach (string itemToRemove in itemsToRemove) 
{ 
    Cache.Remove(itemToRemove); 
} 

이 방법은 괜찮 및 빠르고 쉽게 캐시 종속성보다.

+0

그건 내가 두려워했던거야. 감사합니다. –

+0

멋지게 완료되었습니다. .NET의 다음 버전에서는 정규 표현식을 입력으로 사용하는 모든 컬렉션에서 Remove 메서드를보고 싶습니다. – Vnuk

+1

람다는 더 잘 작동합니다. – Audrius

2

적절하게 무효화하는 CacheDependency의 하위 클래스를 작성할 수 있습니다.

0

정말 캐시 항목의 수와 정리 작업 빈도에 따라 다릅니다. 실제로 성능 문제 (예 : 측정)에 불과한 경우에만 걱정할 것입니다.

당신이 뭔가 극단적 인 일을하지 않는 한 당신의 해결책은 저에게 좋습니다. 당신이 그것을 반복하는 동안이 같은 것을 할 필요가 있으므로

0

캐시 정리의 경우 캐시 항목이 너무 많을 때 수동으로 실행해야한다고 가정합니다. MS lib 캐시 블록을 사용하면이 작업을 자동으로 수행 할 수 있습니다. cachingConfiguration에서; 당신은 속성 maximumElementsInCacheBeforeScavenging을 설정할 수 있습니다; 캐시 항목 수가 제한을 초과하면 캐시 관리자는 자동으로 캐시를 지 웁니다.

1

이 목적으로 만 캐시에 다른 항목을 보관해야합니다. cache_prefix_XXX와 같은 키를 사용하여 10.000 항목을 캐시한다고 가정 해 보겠습니다. 따라서 cache_prefix를 키로 사용하여 항목을 추가하고이 키에 대한 종속성을 나머지 항목에 추가하면 모든 키의 제거를 제어 할 수 있습니다. 고려해야 할 한 가지는 우선 순위입니다. 특정 항목을 실제 데이터 항목보다 우선 순위를 높게 설정하십시오.