All Topics, .NET, C#, ASP.NET >> ASP.NET >> Caching
http://www.codeproject.com/aspnet/cachingaspnet.asp

Caching in ASP.NET
By Smitha Vijayan

An overview of caching in ASP.NET.

 

ASP.NET, C#
Windows (WinXP), .NET (.NET 1.0)
Win32, VS
Dev

 

Posted 22 Feb 2004

 

20,978 views

 

 

28 members have rated this article. Result:

Popularity: 5.95. Rating: 4.11 out of 5.

웹사이트의 페이지 대부분은 동적이다. , 사용자의 요청에 의해서 만들어진 페이지이다. 알다시피 동적 웹페이지는 동적인 웹문서를 제공하고, 사용자의 요청페이지에 맞추어진다(:홈페이지). 동적페이지는 또한 동적인 캐슁데이터저장소로부터 가져와서 제공해준다. 캐슁데이터저장소는 관리자가 데이터저장이 매번 바뀌는 페이지 문서에 대해서 바꿔야 하는 필요가 없다(:출판사 웹사이트의 책목록). 이러한 것에 대한 단점은 모든 사용자의 요구를 위한 페이지를 만듬으로써 부담이 생기는 것이다.

 

이러한 점을 커버하기 위해서, 어떤 웹사이트들은 페이지 생성 엔진을 가지고 있고, 그것은 사용자들에게 제공되어지는 모든 HTML페이지들을 한번에 만들고 저장한다. 그러나 이것은 단지 두번째 예제에서 보여지는 페이지문서가 모든 요청[사용자독립] 대해서 같은 시나리오에서만 도움을 것이다. 만약 쿼리스트링으로 다른 카테고리 ID값을 제공함으로써 만들어지는 북카테고리 목록이 있다면, 책의 일부 카테고리를 출력하는 페이지는 사용자에게 있어서 모두 같게 된다.

 

ASP.NET 나아가 커질수 있는 이러한 문제점을 해결할 있는 caching 지원하여 제공해준다. 그것은 페이지에서 발생하는 출력(output) 캐쉬(메모리에 저장) 있고, 나중의 요청에 위한 캐쉬된 문서를 제공해 것이다. 그리고 이것은 앞에서 소개한 두번째 시나리오에서만 유용하다. 캐슁의 특징은 다양한 방법으로 바꾸는 것이고 기사를 통해서 어떻게 하는지 보게 것이다.

 

 

Caching a page 캐슁 페이지

페이지의 출력(output) 캐쉬하기 위해서, 페이지 상단에 @OutputCache 지시자를 지정해야만 한다. 이형식은 아래와 같다:

 

<%@ OutputCache Duration=5 VaryByParam="None" %>

 

보시다시피 지시자에는 두가지 속성(attribute) 있다.

 

·          Duration - 캐쉬해야만 하는 output 얼마나 오랫동안 보여줄지 초로 설정하는 시간이다. 지정된 duration 경과한 후에, 캐쉬된 output 지워지고 페이지문서는 다음요청을 발생시킬것이다. output 다시 10동안 캐쉬되고 이렇한 처리는 반복된다.

 

·          VaryByParam - 속성은 강제적이고 캐쉬를 변화시키기 위한 쿼리스트링 파라메터(querystring parameter) 지정한다.

위에서 보면 VaryByParam 속성을 None으로 지정했다. 의미는 페이지문서가 쿼리스트링으로 지정된 파라메터와 상관없이 같다는 것이다.

 

만약 각각 다른 쿼리스트링 파라메터를 가지고 있는 같은 페이지를 두번 요청을 한다면, [:.../PageCachingByParam.aspx?id=12 and .../PageCachingByParam.aspx?id=15] 각각의 페이지문서는 독립적으로 발생됩니다. 지시자는 아래와 같이 되어야 합니다.

 

<%@ OutputCache Duration=5 VaryByParam="id" %>

 

두번 요청된 페이지 문서는 Duratioin 속성으로 지정된 시간으로 따로 캐쉬됩니다.

다중파라메터를 지정하기 위해서는 파라메터 이름을 “;”(semiconlon)으로 구분하여 사용하십시오. 만약 VaryByParm 속성을 “*”으로 지정한다면, 캐쉬된 문서는 쿼리스트링으로 인정되는 모든 파라메터들을 바꾸게 됩니다.

 

어떤 페이지는 다른 브라우져에서 문서를 만들게 됩니다. 이러한 경우, 다른 브라우져에서 캐쉬된 출력(output) 바꾸기 위한 준비가 되어 있습니다. @OutputCache지시자는 아래와 같이 수정되어야 합니다.

 

<%@ OutputCache Duration=5 VaryByParam="id" VaryByCustom="browser" %>

 

이것은 캐쉬된 output 브라우져 뿐만 아니라 대다수의 버젼의 브라우져에서도 적용될 것입니다. IE5, IE 6, Netscape 4, Netscape 6 모두 다른 캐쉬된 출력 버젼을 얻을 것입니다.

 

 

Caching page fragments

 

때때로 페이지의 한부분만을 캐쉬하고 싶을 때가 있습니다. 예를 들어, 페이지에서 상위페이지를 가지고 있고, 그것은 사용자들에게 있어서는 같은 문서일 것입니다. 상위에 있는 텍스트나 이미지는 매일 바뀌게 하고 싶을 때도 있습니다. 이런 경우, 하루의 시간중에 헤더에 캐쉬를 하고 싶을 것입니다.

 

솔루션은 유저컨트롤안에 헤더문서를 놓는다고 가정하고, 유저컨트롤 문서를 캐쉬하여 지정합니다. 기술을 fragment caching라고 부릅니다.

 

유저컨트롤에 캐쉬를 지정하기 위해서, 페이지에서 사용한 것처럼 @OutputCache지시자를 사용합니다.

 

<%@ OutputCache Duration=10 VaryByParam="None" %>

 

위에서 지정한 것을 보면, 유저컨트롤문서는 Duration 속성이 10으로 시간이 지정되어 캐쉬됩니다. 쿼리스트링 파라메터와 브라우져 타입이나 버젼과는 상관없이 캐쉬된 output 똑같은 역할을 합니다.

 

 

Data Caching 데이터 캐슁

 

ASP.NET 또한 객체로서 데이터캐슁을 지원합니다. 메모리에 객체를 저장할 있고, 어플리케이션에서 다양한 페이지에서 객체를 사용할 있습니다. 특성은 Cache클래스를 사용하여 구현되어 집니다. 캐쉬는 어플리케이션과 같은 라이프타임을 가집니다. 객체는 캐쉬안에 한쌍의 이름값으로 저장되어 집니다. 문자값은 아래와 같이 캐쉬안에서 삽입될 있습니다.

 

Cache["name"]="Smitha";

 

저장된 문자값은 아래와 같이 다시 사용될 수도 있습니다.

 

if (Cache["name"] != null)

    Label1.Text= Cache["name"].ToString();

[See example 4 for an illustration.]

 

캐쉬에 객체를 삽입하기 위해서, Cache클래스의 Add메서드나 다른 버젼에서의 Insert메서드를 사용할 있습니다. 메서드들은 Cache클래스에 의해서 제공되어지는 강력한 특성을 사용하게도 해줍니다. Insert 메서드의 오버로드(overload)중에 하나를 아래와 같이 사용합니다.

 

Cache.Insert("Name", strName,

    new CacheDependency(Server.MapPath("name.txt"),

    DateTime.Now.AddMinutes(2), TimeSpan.Zero);

 

앞에 두개의 파라메터는 키와 객체에 삽입되어집니다. 세번째 파라메터는 CacheDependency타입이고, name.txt파일에서 가져오는 값을 설정하는 것을 도와줍니다. 파일이 바뀔때 마다, 캐쉬의 값은 지워집니다. 사용하지 않기 위해서는 null값을 지정합니다. 네번째 파라메터는 값이 캐쉬로부터 지워져야 시간을 지정합니다.[See example 5 for an illustration.] 마지막 파라메터는 캐쉬로부터 지워질 아이템과 마지막에 접속한 시간사이의 간격을 보여주는 sliding expiration parameter입니다.

 

시스템메모리가 낮아지게 , 캐쉬는 자동적으로 메모리로부터 마지막에 사용된 아이템을 지워줍니다. 캐쉬를 추가할 아이템의 우선순위값(priority values) 지정할 있습니다. 왜냐하면 어떤 아이템을 다른것보다 우선권을 주게 하기 위해서입니다.

 

Cache.Insert("Name", strName,

    new CacheDependency(Server.MapPath("name.txt"),

    DateTime.Now.AddMinutes(2), TimeSpan.Zero,

    CacheItemPriority.High, null);

 

CacheItemPriority 열거자는 다양한 우선권 값을 설정하기 위한 멤버를 가지고 있습니다. CacheItemPriority.High아이템에게 우선권 레벨을 할당합니다. 왜냐하면 아이템은 캐쉬로부터 지워질 처럼 보이는 가장 작은 것이기 때문입니다.

 

 

Points of interest 중요포인트

  • 만약 캐쉬페이지출력을 위한 Response.Expires속성을 사용한 예전 ASP페이지가 있다면, 페이지는 다시 바꿀 있습니다. ASP.NET 역시 속성을 지원합니다.
  • Cache클래스의 Insert메서드는 같은 키이름으로 존재하는 아이템이 있다면 덮어쓸 것입니다.
CacheItemPriority.NotRemovable 우선권 값은 Cache.Insert메서드로 사용되어 있는데, 아이템은 청소하는 동안 캐쉬로부터 지워지지 않을 것이기 때문에 아이템의 우선권 레벨을 설정합니다.

+ Recent posts