2017-11-27 1 views
1

내 응용 프로그램에서 MemoryCache를 사용하지만 항목이 만료 될 것으로 예상하지 않습니다. 따라서 항목은 AbsoulteExpiration 또는 SlidingExpiration이 설정되지 않은 상태에서 기본 정책으로 캐시에 삽입됩니다.MemoryCache - 항목 만료 방지

최근에 높은 서버에서 마지막으로 캐시에 문제가 발생했습니다. 이전에 캐시에 삽입 된 원하는 값 대신 null 값을 반환했기 때문입니다. 만료 날짜가 명시 적으로 설정된 항목 만 캐시에서 제거된다는 사실이 밝혀졌습니다. CacheMemoryLimit 및/또는 PhysicalMemoryLimit 값을 초과하는 메모리 압력에서 MemoryCache는 다른 요소도 제거합니다.

이 문제를 방지하려면 어떻게해야합니까? 요소가 캐시에 한번 설정되면 안전하게 다시 요소에서 가져올 수 있습니다.

PollingInterval을 몇 가지 큰 값으로 설정하는 것이 고려되었지만 잠재적 인 문제 만 지연됩니다 (폴링 간격은 문서에서 정확한 시간 또는 최소 시간이 아닌 최대 시간으로 참조됩니다). PhysicalMemoryLimitPercentage을 100 %로 설정하면 물리적으로 설치된 메모리를 참조하고 사용 가능한 전체 가상 메모리를 참조하지 않으므로 문제가 해결되지 않습니다. 아니면 내가 틀렸고 정말로 도움이 되었습니까?

+1

귀하의 질문은 주기적으로 캐시를 늘리거나 일부 값을 제거하라는 메시지를 표시합니다. 영원히 캐시를 채울 수 없습니다. – lucky

+1

아마 당신은 정적 ConcurrentDictionary를 대신 사용하고 싶습니까? – Magnus

+0

'CacheItemPolicy'에는 설정할 수있는 [Priority] (https://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.priority (v = vs.110) .aspx) 속성이 있습니다. 'NotRemovable'. –

답변

2

CacheItemPolicy은 으로 설정할 수있는 Priority 속성을 가지고 있습니다.

이 설정으로 캐시에 추가 할 데이터의 양을 알아야합니다. 데이터를 캐시에 지속적으로 추가하고 절대로 제거하지 않으면 메모리 나 오버 플로우 문제가 발생할 수 있습니다.

캐시는 일반적으로 항목이 캐시에 더 이상 존재하지 않는 경우 허용됩니다.이 경우 값은 영구 저장소 (예 : 데이터베이스 또는 파일)에서 다시 검색됩니다.

경우에 따라 코드에 항목이 있어야하는 것처럼 들리므로 다른 접근법 (예 : 주석에 언급 된 정적 ConcurrentDictionary)을 제안 할 수 있습니다.