0

현재 작동하는 MemoryCache.Default 인스턴스에 항목을 삽입하려고합니다. 그러나 항목이 만료되지 않습니다! 폴링 간격은 기본적으로 2 분으로 설정되어 있으며 MemoryCache에 대한 특정 설정이 없습니다.System.Runtime.Caching의 MemoryCache : 항목이 만료되지 않습니다.

항목 추가 루틴은 다음과 같이이다 : 그러나, 항목이 캐시에 만료되지 않습니다

string key = "someKey"; 
var faultyItem = GetFaultyItemToBlockFromProcessingTheNextThreeMinutes(); 

if (!MemoryCache.Default.Contains(key)) 
{ 
    MemoryCache.Default.Add(
     new CacheItem(key, faultyItem), 
     new CacheItemPolicy() 
     { 
      AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(3) 
     }); 
} 

! 나는 10 분 이상 기다렸고, 그들은 여전히 ​​캐시에있다. 주요 목적은 데이터베이스를 몇 초마다 처리하려고 시도하여 데이터베이스에 쿼리가 넘치지 않도록하는 것입니다. 그들은 몇 초마다 점검되지만 미끄럼 방지는 없습니다. 최대 지연 시간은 여전히 ​​용인 될 수 있으므로 대략 3 분 5 분 후에 다시 확인해야합니다.

코드 외부의 구성을 XML로하고 싶지 않습니다. 가능하지 않다면 MemoryCache 대신 좋은 대안이 있습니까? 아마도 숫자/객체 키와 매개 변수 및 속성을 통한 구성이 필요합니까?

+0

환경이 UTC 시간대로 실행되고 있습니까? 어떻게 10 분 동안 "기다리는"거야? – Algirdas

답변

2

질문에서 코드 스 니펫으로 처음부터 간단한 시험 응용 프로그램을 설정했습니다. 내가 만든 유일한 수정 사항은 다음과 같습니다. var faultyItem = "test";

MemoryCache.Default.Contains(key)에 시계를 넣으면 3 분 후 해당 항목이 캐시에서 퇴거되었음을 확인할 수 있습니다. 해당 진술은 false입니다.

하나의 가능성은 응용 프로그램의 다른 곳에서 이미 만료가없는 동일한 키를 사용하여 MemoryCache에 항목을 넣었 기 때문에 결코 떨어지지 않으며 새 항목으로 업데이트되지 않습니다 절대 만기가 있습니다. 앱을 검색하는 것 외에도이를 테스트하는 한 가지 방법은이 특정 작업에 기본 캐시 대신 명명 된 캐시를 사용하여 잠재적 인 공유 사용을 식별하는 것입니다. 즉 static MemoryCache testCache = new MemoryCache("TestCache")입니다.