2015-01-29 2 views
0

그래서 ASP.NET MVC 응용 프로그램에서 viewmodel 당 일반/사용자 바운드 캐시 컨텍스트를 얻으려면 System.Runtime MemoryCache 주위에 몇 가지 래퍼 메소드를 작성했습니다.Memorycache는 내 객체를 저장하지 않습니다.

어떤 점에서 나는 명백한 이유없이 내 저장된 객체를 검색하는 대신 내 대의원이 매번 호출되는 것을 보았습니다.

이상하게도 (간단한 데이터를 사용하여 검사하는) 단위 테스트가 실패했거나 설명하는 패턴이 보이지 않았습니다.

여기에 래퍼 방법 중 하나입니다 : 누군가가 여기에 MemoryCache 내에서 스토리지에 대한 잘못된 개체를 렌더링 조건에 대해 알고있는 경우

public T GetCustom<T>(CacheItemPolicy cacheSettings, Func<T> createCallback, params object[] parameters) 
    { 
     if (parameters.Length == 0) 
      throw new ArgumentException("GetCustom can't be called without any parameters."); 

     lock (_threadLock) 
     { 
      var mergedToken = GetCacheSignature(parameters); 
      var cache = GetMemoryCache(); 
      if (cache.Contains(mergedToken)) 
      { 
       var cacheResult = cache.Get(mergedToken); 
       if (cacheResult is T) 
        return (T)cacheResult; 

       throw new ArgumentException(string.Format("A caching signature was passed, which duplicates another signature of different return type. ({0})", mergedToken)); 
      } 

      var result = createCallback(); <!-- keeps landing here 
      if (!EqualityComparer<T>.Default.Equals(result, default(T))) 
      { 
       cache.Add(mergedToken, result, cacheSettings); 
      } 

      return result; 
     } 
    } 

가 궁금했다.

그때까지는 저장소가 작동 할 때까지 복잡한 클래스의 속성을 제거 할 것입니다.

그럼에도 불구하고 경험은 흥미로울 것입니다.

+0

@Andreas Experience - 생성자에서 고정 된 만료 날짜 시간을 설정하여 모든 단위 테스트를 통과 한 다음 제작 과정에서 날짜가 지난 후에 아무것도 캐시 할 수 없게되었습니다. 비슷한 소리. 체크 캐시 설정은 모든 cache.Add() 호출에 합당한 (그리고 미래의) 만료 날짜를 제공합니다. – Kaido

+0

@AlexeiLevenkov ASP.NET MVC 5.2 – Dbl

+0

@Kaido 문제의 메서드는 DateTimeOffset.Now.AddMinutes (5)를 절대 만료 날짜로 전달합니다. 항상 날짜. 그래서 그렇게해서는 안됩니다. 감사합니다. 어쨌든 – Dbl

답변

1

왜 발생 될 수 있습니다 몇 빈번한 이유가 있습니다 (실제로 캐시에 개체를 추가 할 수있는 올바른 논리를 가정이/올바른 캐시 인스턴스를 찾을 수) :

  • 86 (32 비트) 프로세스가 메모리의 "아주 작은"양이 처리 할 때 캐시 (또는 캐시의 특정 인스턴스) 외부에서 너무 많은 메모리를 소비하는 것은 상대적으로 쉽고 결과 항목은 즉시 캐시에서 제거됩니다.
  • ASP.Net 앱 도메인은 여러 가지 이유로 인해 캐시를 삭제합니다. 이 적절하게 관리 및 SQL/기타 독립 프로세스 상태 옵션을 통해 지속 할 수 있도록

    • 는 일반적으로 세션 상태에서 "사용자 캐시 된 정보 당"저장 것

    노트.

  • 더 많은 사용자를 지원해야하는 경우 사용자 당 개체를 캐싱하면 성능이 향상되지 않을 수 있습니다. 예상하는 부하 수준에 대한 영향을 신중하게 측정해야합니다.
+0

삭제 된 위임을 첨부하여 해당 축출을 가능한 빨리 감지하려고했습니다. (왜냐하면 나는 다른 질문에서 그것을 읽었다). 메모리 캐시가 즉시 객체를 거부하고 제거 된 이벤트를 발생시키지 않는 경우가 있다고 생각합니까? – Dbl

+0

@ AndreasMüller @ AndreasMüller 잘 모르겠지만 놀랍지는 않을 것입니다. 너무 많은 사람들이 만료시 캐시에 개체를 즉시 다시 삽입하려고합니다 ... http를 살펴 보려하면 http : //referencesource.microsoft.com/ –

+0

예.나는 그것을 살펴볼 것이다. 일들이 보이는 모습으로 판단하면 슬프게도 올바른 방향을 가리킬 수 있습니다. – Dbl

관련 문제