2009-11-24 2 views
12

HttpRuntime.Cache.Insert()를 사용하여 가격 값을 캐시하려고 시도하지만 캐시를 지우기 전에 값을 몇 시간 만 보류하는 것처럼 보입니다 . 내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는 값을 3 일 동안 캐시에 보관하기를 원합니다.C# HttpRuntime.Cache.Insert() 캐시 된 값을 보유하지 않음

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero); 
+0

을 확인하십시오. 어떻게 처리되는지 어떻게 확인합니까? –

+0

@ J.W. : 항목이 제거되었거나 만료 된 경우 Cache [CacheName]은 null입니다. – RickNZ

답변

31

짧은 대답

귀하의 응용 프로그램 풀 또는 웹 사이트가 너무 빨리 종료되고 있습니다. 사이트에서 유휴 시간 제한을 확장하고 사이트를 실행하는 풀의 응용 프로그램 풀 수명을 연장하십시오. 메모리 할당 및 요청 제한을 높입니다. 당신이 때 뭔가가 캐시에서 제거하는 이유, 당신은 삽입에 CacheItemRemovedCallback 옵션을 사용하여 항목 제거를 기록 할 필요가 알고 싶다면

전체 응답

... 그럼 당신은 사용 이유를 기록 할 수 있습니다 CacheItemRemovedReason 인수당신은 따라서 네 나열된 이유 중 하나 이유를 기록 할 수 있습니다 :

  1. 은 제거
    항목은 제거 메서드 호출하거나 동일한 키를 지정된 삽입 메서드 호출에 의해 캐시에서 제거됩니다.
  2. 만료 됨 항목이 만료되었으므로 캐시에서 제거됩니다.
  3. 덜 익숙 함 시스템에서 메모리를 제거하기 위해 항목을 캐시에서 제거했습니다.
  4. DependencyChanged 관련된 캐시 종속성이 변경되어 항목이 캐시에서 제거되었습니다.

일반적으로 만료 및 불충분은 캐시에 대한 호출 제거 ​​및 종속성이없는 설명의 이유가되는 것을 알 수 있습니다.

이 재미있는 것을 추적하면서 항목이 만료 또는 과소 사용되지 않았 음을 알 수 있습니다. 오히려 AppDomain이 언로드된다는 것을 알게 될 것입니다.

한 가지 방법은 web.config (또는 bin 디렉토리 또는 .aspx 등) 파일이 변경되기 때문입니다. 이 문제가 발생한시기에 대한 자세한 내용은 응용 프로그램 섹션을 다시 시작하십시오 (this page 참조). 이러한 상황이 발생하면 현재 보류중인 요청이 모두 유출되고 캐시가 비워지고 AppDomain이 언로드됩니다. AppDomain.IsFinalizingForUnload을 확인하고 콜백 중에이를 기록함으로써이 상황을 감지 할 수 있습니다.

AppDomain이 재활용되는 또 다른 이유는 IIS가 AppPool을 구성한 이유 중 하나로 AppPool을 재활용하기로 결정한 경우입니다. 그 예로는 XXX 메모리 YYY을, 수명에 걸쳐 AppPool을위한 런타임초, TTT 예약 된 재생 시간, IIII 유휴 시간 (수신없이 요청)이 할당되어있다. 자세한 내용은 this article for IIS6 또는 this article for IIS7

+0

이 문제가있어서 iis express가 응용 프로그램을 다시 시작하지 못하게되었습니다. 이상하게도 이것은 mvc 프로젝트에서만 문제였습니다. 나는 full iis로 업그레이드했고 문제는 사라졌습니다. – Jimmy

+1

훌륭한 답변과 훌륭한 사용자 이름! – theycallmemorty

1

앱 풀의 재활용 시간을 확인하십시오.

4

문서의 http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx은 절대 만료를 사용하는 경우 Cache.NoSlidingExpiration을 사용해야한다고 말합니다.

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), Cache.NoSlidingExpiration); 

이 방법으로 문제가되지 않을 수 있습니다하지만, 난 그냥 Cache.NoSlidingExpiration가 TimeSpan.Zero와 동일해야합니다 것을 발견했다.

다음으로 귀하의 앱 풀이 만료되지 않았는지 확인하고 사용중인 캐시의 용량을 확인하십시오. 메모리가 많은 트래픽 사이트 (예 : 메모리 캐시)의 경우 메모리가 다른 것들에 필요하므로 캐시 항목이 만료됩니다.

여기 마지막 댓글을 확인하십시오. http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon 누군가가 문제의 해결책을 찾은 것 같습니다.

+0

이것은 관련없는 질문에서 나를 도왔다. 감사! – klkitchens

0

기본적으로 캐시에 추가 된 항목에는 만료가 설정되지 않으므로 캐시 외부에있는 항목입니다. Josh와 동의합니다. 앱 풀의 재활용 시간을 확인해야합니다.

캐시에서 항목이 삭제되는시기를 정확하게 알 수 있도록 대리인을 추가하는 방법에 대한 예를 보려면이 페이지를 확인하십시오. 그것은 당신의 응용 프로그램 풀 아니라면이 문제 해결에 도움이 될 수 있습니다

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

~ md5sum이 ~

5

캐시 개체가 훨씬 적은, 모든 캐시 된 개체에 개최되는 것은 아닙니다 당신이 제안한 모든 시간.

캐시에 항목을 삽입 할 때 CacheItemPriority.High 또는 CacheItemPriority.NotRemovable을 설정할 수 있습니다. 기본 우선 순위 인 기본 우선 순위를 사용하면 런타임은 메모리 압력이 증가 할 때 객체를 이동시키는 상당히 적극적인 정책을 갖습니다.

기본적으로 IIS AppPool은 1 일 1 회 정도 재활용되므로 캐시의 모든 항목이 지워집니다.

관련 문제