source

메모리 캐시 범위 세션 또는 응용 프로그램이 광범위합니까?

goodcode 2023. 8. 24. 22:46
반응형

메모리 캐시 범위 세션 또는 응용 프로그램이 광범위합니까?

는 중용사를 합니다.MemoryCacheASP.NET 그리고 그것은 잘 작동하고 있습니다.저장소에서 데이터를 새로 꺼내는 것을 방지하기 위해 한 시간 동안 캐시되는 개체가 있습니다.

디버그에서 캐싱이 작동하는 것을 볼 수 있지만, 일단 서버에 배포되면 첫 번째 호출이 실행되고 개체가 캐시된 후 후속 호출은 약 1/5입니다.

그러나 각 새로운 클라이언트 호출(1시간 창 내에서 여전히 - 실제로는 1분 또는 2분 후)은 데이터가 캐시되기 전의 원래 호출과 거의 같은 시간이 소요되는 서비스(캐슁 중인 서비스)에 대한 첫 번째 호출인 것 같습니다.

이것은 나를 궁금하게 만들기 시작했습니다 - is.MemoryCache세션별로, 그리고 통화를 하는 각각의 새로운 클라이언트가 자신의 캐시를 저장하고 있는 것입니까, 아니면 데이터가 캐시되었다는 것을 알고도 첫 번째 통화가 그렇게 오래 걸리도록 다른 일이 일어나고 있는 것입니까?

MSDN에서:

캐시 클래스와 메모리 캐시 클래스의 주요 차이점은 메모리 캐시 클래스가 에서 사용할 수 있도록 변경되었다는 것입니다.ASP가 아닌 NET Framework 응용 프로그램.NET 응용 프로그램.예를 들어 MemoryCache 클래스는 시스템에 대한 종속성이 없습니다.웹 어셈블리.또 다른 차이점은 동일한 애플리케이션 및 동일한 AppDomain 인스턴스에서 사용할 MemoryCache 클래스의 인스턴스를 여러 개 생성할 수 있다는 점입니다.

그것을 읽고 반영된 코드에서 조사를 하는 것은 명백합니다.MemoryCache단순한 수업일 뿐입니다.사용할 수 있습니다.MemoryCache.Default속성을 사용하여 동일한 인스턴스를 사용하거나 원하는 만큼 인스턴스를 구성할 수 있습니다(권장은 가능한 한 적음).

그래서 기본적으로 답은 당신의 코드에 있습니다.
사용하는 경우MemoryCache.Default기본 응용 프로그램 풀 유휴 시간 제한은 20분으로 미만입니다. (기본 시간 이며, 1시간 입니다.)

다음을 사용하여 생성하는 경우new MemoryCache(string, NameValueCollection)됩니다. 에 인스턴스를 가 하나의 요청에 존속합니다. 즉, " " 위 언 고 사 컨 적 그 가 그 다 트 스 니 용 됩 인 내 스 생 유 대 를 트 하 요 캐 경 다 니 바 의 합 해 청 효 않 우는나 에 컨 시 는 다 니 랍 를 하 기 렇 지 롤성면즉

추천서를 찾을 수 없어서 유감입니다만...MemoryCache사용자가 지정한 캐시 정책에 따라 데이터를 보유할 것을 보장하지 않습니다.특히 앱을 실행 중인 컴퓨터가 메모리에 스트레스를 받는 경우 캐시가 삭제될 수 있습니다.

여전히 초기 캐시 항목 무효화의 원인을 파악할 수 없는 경우에는 항목 무효화의 원인을 파악하고 조사할 수 있습니다.

1년 후 이것을 검토하면서 저는 캐시가 무작위로 '드롭'되는 것에 대한 몇 가지 정보를 원래 게시물에서 발견했습니다.MSDN은 구성 가능한 캐시 속성에 대해 다음을 명시합니다.CacheMemoryLimitMegabytes그리고.PhysicalMemoryLimitPercentage:

기본값은 0이며, 이는 MemoryCache 클래스의 자동 크기 휴리스틱이 기본적으로 사용됨을 의미합니다.

디컴파일링 및 조사를 수행하면, 사전에 결정된 시나리오가 있습니다.CacheMemoryMonitor.cs메모리 임계값을 정의하는 클래스입니다.다음은 해당 클래스의 코멘트 샘플입니다.AutoPrivateBytesLimit속성:

// Auto-generate the private bytes limit:
// - On 64bit, the auto value is MIN(60% physical_ram, 1 TB)
// - On x86, for 2GB, the auto value is MIN(60% physical_ram, 800 MB)
// - On x86, for 3GB, the auto value is MIN(60% physical_ram, 1800 MB)
//
// - If it's not a hosted environment (e.g. console app), the 60% in the above
//   formulas will become 100% because in un-hosted environment we don't launch
//   other processes such as compiler, etc.

특정 값이 캐시가 자주 사용되는 이유, 즉 가져오는 것을 원하지 않는 큰 개체를 저장하는 것만큼 중요한 것은 아닙니다.이러한 개체가 캐시에 저장되고 있으며 이러한 내부 계산에 기반한 호스팅 환경 메모리 임계값을 초과하면 항목이 캐시에서 자동으로 제거될 수 있습니다.IIS에서 여러 앱을 실행하는 약 2GB의 메모리가 있는 호스트 서버의 메모리에 매우 큰 컬렉션을 저장하고 있었기 때문에 작업이 확실히 설명될 수 있습니다.

이러한 값을 설정하는 데는 명시적으로 재정의가 있습니다.구성(또는 설정할 때)을 사용할 수 있습니다.MemoryCache인스턴스) 설정CacheMemoryLimitMegabytes그리고.PhysicalMemoryLimitPercentage가치.다음은 다음 MSDN 링크에서 수정된 샘플입니다. MSDN 링크는 다음과 같습니다.physicalMemoryPercentage95%(%)까지:

<configuration>
  <system.runtime.caching>
    <memoryCache>
      <namedCaches>
          <add name="default" 
               physicalMemoryLimitPercentage="95" />
      </namedCaches>
    </memoryCache>
  </system.runtime.caching>
</configuration>

언급URL : https://stackoverflow.com/questions/16678927/is-memorycache-scope-session-or-application-wide

반응형