asp.net-mvc의 캐싱


82

asp.net-mvc 사이트에서 가장 데이터베이스가 많은 작업을 캐시하고 싶습니다. 내 연구에서 나는

  • Phil의 블로그에서 도넛 캐싱
  • Kazi 블로그의 캐싱 / 압축 필터
  • Scott Hansleman의 팟 캐스트는 그들이 어떻게 물건을 SO에 캐시했는지에 대한 것입니다.

그러나 나는 그것을 아직 얻지 못했다.
여러 파에 따라 POST 요청을 캐시 할 수 있기를 원합니다. 이러한 구문은 개체에 있습니다. 따라서 다음 요청의 결과를 캐시하고 싶습니다.

public ActionResult AdvancedSearch(SearchBag searchBag)

여기서 searchBag는 선택적 검색 매개 변수를 보유하는 객체입니다. 내 뷰 자체는 가볍지 만 검색 백에 채워지는 필드에 따라 데이터 액세스에 시간이 많이 걸릴 수 있습니다.

내 행동보다는 데이터 레이어에 캐싱해야한다는 느낌이 듭니다.
OutputCache 속성에서 VaryByParam을 어떻게 사용해야합니까?


2
VaryByParam = "searchBag.property"를 사용해 보셨습니까?
Eduardo Campañó

아뇨. 당신이 말하는 것을 시도 할 것입니다. 그러나 여러 매개 변수를 열거하는 것은 어떻습니까?
Boris Callens

2
VaryByParam = "firstParam; secondParam; thirdParam"
Arnis Lapsa

1
조금 늦었지만 Enterprise Library Caching Application Block이 .Net 4.0에 포함되어 있으므로 이제 System.Runtime.Caching 의 MemoryCache를 사용 하여 비슷한 효과 를 얻을 수 있습니다 . 너무 어디서나 :)
Carl

답변:


74

모델이나 데이터 레이어에도 캐시하는 것을 좋아합니다. 이것은 컨트롤러 / 프레젠테이션에서 데이터를 검색하는 것과 관련된 모든 것을 분리합니다. System.Web.HttpContext.Current.Cache엔터프라이즈 라이브러리에서 캐싱 애플리케이션 블록을 사용하거나 ASP.NET 캐시에 액세스 할 수 있습니다 . 쿼리에 대한 매개 변수에서 캐시 된 데이터에 대한 키를 만듭니다. 데이터를 업데이트 할 때 캐시를 무효화해야합니다.


1
엔터프라이즈 라이브러리를 읽어야한다고 생각합니다. 대부분의 지연은 데이터 레이어에 있기 때문에 결국에는 이것이 최상의 솔루션이 될 것이라고 생각합니다. 이 : 오래된 객체 문제를 eleviates 그래서 현재는 읽기 전용 DB이며,
보리스 CALLENS

17
캐싱 앱 블록은 지나치게 엉망인 것 같습니다. 거의 모든 인스턴스에서 HttpRuntime.Cache가 충분하다는 것을 알았습니다.
Jeff Putz

3
왜 과잉? 나는 이제 개발에 훨씬 더 깊이 들어가서 EL의 캐시 시스템이 정말 사용하기 쉽다는 것을 알게되었습니다. 올바른 라이브러리를 참조하고 올바른 구성 줄을 추가하면 각각 한 줄의 코드로 개체 캐싱 및 검색을 시작할 수 있습니다.
Boris Callens 2009-10-29

6
나는 그것이 어떤 사람들을 짜증나게하는 "올바른 구성 라인 추가"단계라고 생각한다.
Mike Chamberlain

데이터베이스에 업데이트가있을 때 메모리 캐시를 무효화하는 방법을 설명 할 수 있다면 좋을 것입니다. 서비스를 사용하여 자주 확인하고 캐시를 지우는 방법은 무엇입니까?
shaijut

66

또는 HttpContext.Current와 독립적이고 HttpRuntime.Cache에서 캐시에 액세스 할 수 있습니다. :)


이는 또한 코드가 백그라운드 스레드에서 실행될 때 (즉, async / await goodness) '캐시'에 계속 액세스 할 수 있음을 의미합니다.
Michael K. Campbell

12

종종 OutputCaching은 가장 빠르고 효율적일 수 있지만 요구 사항을 충족 할 때만 가능합니다. 틀렸다면 빠르고 효율적으로 사용할 필요가 없습니다! ;)

이 경우 복잡한 캐싱이 필요하기 때문에 데이터 레이어에서의 캐싱이 올바른 것처럼 들립니다. 캐시되는 출력을 제어하는 ​​매개 변수 세트가 간단한 경우 두 가지를 결합 할 수 있습니다.


0

다음과 같은 출력 캐싱을 사용할 수 있습니다.

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

또는 웹 구성에서 설정 한 캐시 프로필을 사용할 수 있습니다.

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.