Share via


캐싱

작성자: Microsoft

캐싱에 대한 이해는 성능이 뛰어난 ASP.NET 애플리케이션에 중요합니다. ASP.NET 1.x는 세 가지 캐싱 옵션을 제공했습니다. 출력 캐싱, 조각 캐싱 및 캐시 API.

캐싱에 대한 이해는 성능이 뛰어난 ASP.NET 애플리케이션에 중요합니다. ASP.NET 1.x는 세 가지 캐싱 옵션을 제공했습니다. 출력 캐싱, 조각 캐싱 및 캐시 API. ASP.NET 2.0은 이러한 세 가지 방법을 모두 제공하지만 몇 가지 중요한 추가 기능을 추가합니다. 몇 가지 새로운 캐시 종속성이 있으며 개발자는 이제 사용자 지정 캐시 종속성도 만들 수 있습니다. 캐싱 구성도 ASP.NET 2.0에서 크게 개선되었습니다.

새로운 기능

캐시 프로필

캐시 프로필을 사용하면 개발자가 개별 페이지에 적용할 수 있는 특정 캐시 설정을 정의할 수 있습니다. 예를 들어 12시간 후에 캐시에서 만료되어야 하는 일부 페이지가 있는 경우 해당 페이지에 적용할 수 있는 캐시 프로필을 쉽게 만들 수 있습니다. 새 캐시 프로필을 추가하려면 구성 파일의 <outputCacheSettings> 섹션을 사용합니다. 예를 들어 아래는 캐시 기간을 12시간으로 구성하는 twoday 라는 캐시 프로필의 구성입니다.

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

이 캐시 프로필을 특정 페이지에 적용하려면 아래와 같이 @ OutputCache 지시문의 CacheProfile 특성을 사용합니다.

<%@ OutputCache CacheProfile="TwoDay" %>

사용자 지정 캐시 종속성

ASP.NET 1.x 개발자는 사용자 지정 캐시 종속성을 요구했습니다. ASP.NET 1.x에서는 CacheDependency 클래스가 봉인되어 개발자가 자체 클래스를 파생할 수 없습니다. ASP.NET 2.0에서는 해당 제한이 제거되고 개발자는 사용자 지정 캐시 종속성을 자유롭게 개발할 수 있습니다. CacheDependency 클래스를 사용하면 파일, 디렉터리 또는 캐시 키를 기반으로 사용자 지정 캐시 종속성을 만들 수 있습니다.

예를 들어 아래 코드는 웹 애플리케이션의 루트에 있는 stuff.xml 라는 파일을 기반으로 새 사용자 지정 캐시 종속성을 만듭니다.

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

이 시나리오에서는 stuff.xml 파일이 변경되면 캐시된 항목이 무효화됩니다.

캐시 키를 사용하여 사용자 지정 캐시 종속성을 만들 수도 있습니다. 이 메서드를 사용하면 캐시 키를 제거하면 캐시된 데이터가 무효화됩니다. 다음 예제에서는 이에 대해 설명합니다.

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

위에 삽입된 항목을 무효화하려면 캐시 키 역할을 하기 위해 캐시에 삽입된 항목을 제거하면됩니다.

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

캐시 키 역할을 하는 항목의 키는 캐시 키 배열에 추가된 값과 동일해야 합니다.

Polling-Based SQL 캐시 종속성(Table-Based 종속성이라고도 함)

SQL Server 7 및 2000은 SQL 캐시 종속성에 폴링 기반 모델을 사용합니다. 폴링 기반 모델은 테이블의 데이터가 변경될 때 트리거되는 데이터베이스 테이블의 트리거를 사용합니다. 이 트리거는 주기적으로 검사할 ASP.NET 알림 테이블의 changeId 필드를 업데이트합니다. changeId 필드가 업데이트된 경우 ASP.NET 데이터가 변경되었음을 알고 캐시된 데이터를 무효화합니다.

참고

SQL Server 2005도 폴링 기반 모델을 사용할 수 있지만 폴링 기반 모델이 가장 효율적인 모델이 아니기 때문에 SQL Server 2005에서 쿼리 기반 모델(나중에 설명)을 사용하는 것이 좋습니다.

폴링 기반 모델을 사용하는 SQL 캐시 종속성이 올바르게 작동하려면 테이블에 알림이 활성화되어 있어야 합니다. SqlCacheDependencyAdmin 클래스를 사용하거나 aspnet_regsql.exe 유틸리티를 사용하여 프로그래밍 방식으로 수행할 수 있습니다.

다음 명령줄은 SQL 캐시 종속성에 대한 dbase라는 SQL Server instance 있는 Northwind 데이터베이스에 Products 테이블을 등록합니다.

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

다음은 위의 명령에 사용된 명령줄 스위치에 대한 설명입니다.

명령줄 스위치 용도
-S server 서버 이름을 지정합니다.
-Ed SQL 캐시 종속성에 대해 데이터베이스를 사용하도록 지정합니다.
-d database_name SQL 캐시 종속성을 사용하도록 설정해야 하는 데이터베이스 이름을 지정합니다.
-E 데이터베이스에 연결할 때 aspnet_regsql Windows 인증 사용하도록 지정합니다.
-동부 표준시 SQL 캐시 종속성에 데이터베이스 테이블을 사용하도록 지정합니다.
-t table_name SQL 캐시 종속성을 사용하도록 설정할 데이터베이스 테이블의 이름을 지정합니다.

참고

aspnet_regsql.exe 사용할 수 있는 다른 스위치가 있습니다. 전체 목록을 보려면 -? aspnet_regsql.exe 실행합니다. 명령줄에서

이 명령을 실행하면 SQL Server 데이터베이스에 다음과 같은 변경 내용이 적용됩니다.

  • AspNet_SqlCacheTablesForChangeNotification 테이블이 추가됩니다. 이 테이블에는 SQL 캐시 종속성이 사용하도록 설정된 데이터베이스의 각 테이블에 대해 하나의 행이 포함되어 있습니다.
  • 다음 저장 프로시저는 데이터베이스 내부에 만들어집니다.
AspNet_SqlCachePollingStoredProcedure AspNet_SqlCacheTablesForChangeNotification 테이블을 쿼리하고 SQL 캐시 종속성 및 각 테이블에 대해 changeId 값을 사용하도록 설정된 모든 테이블을 반환합니다. 이 저장된 프록시는 데이터를 변경했는지 확인하기 위해 폴링에 사용됩니다.
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure AspNet_SqlCacheTablesForChangeNotification 테이블을 쿼리하여 SQL 캐시 종속성에 대해 사용하도록 설정된 모든 테이블을 반환하고 SQL 캐시 종속성에 대해 사용하도록 설정된 모든 테이블을 반환합니다.
AspNet_SqlCacheRegisterTableStoredProcedure 알림 테이블에 필요한 항목을 추가하여 SQL 캐시 종속성에 대한 테이블을 등록하고 트리거를 추가합니다.
AspNet_SqlCacheUnRegisterTableStoredProcedure 알림 테이블의 항목을 제거하여 SQL 캐시 종속성에 대한 테이블을 등록 취소하고 트리거를 제거합니다.
AspNet_SqlCacheUpdateChangeIdStoredProcedure 변경된 테이블에 대한 changeId를 증분하여 알림 테이블을 업데이트. ASP.NET 이 값을 사용하여 데이터가 변경되었는지 확인합니다. 아래와 같이 이 저장된 프록시는 테이블이 활성화될 때 생성된 트리거에 의해 실행됩니다.
  • 테이블에 대해 table_name_AspNet_SqlCacheNotification_Trigger라는 SQL Server 트리거가 만들어집니다. 이 트리거는 테이블에서 INSERT, UPDATE 또는 DELETE가 수행될 때 AspNet_SqlCacheUpdateChangeIdStoredProcedure 실행합니다.
  • aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess 라는 SQL Server 역할이 데이터베이스에 추가됩니다.

aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess SQL Server 역할에는 AspNet_SqlCachePollingStoredProcedure 대한 EXEC 권한이 있습니다. 폴링 모델이 올바르게 작동하려면 프로세스 계정을 aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess 역할에 추가해야 합니다. aspnet_regsql.exe 도구는 이 작업을 수행하지 않습니다.

Polling-Based SQL 캐시 종속성 구성

폴링 기반 SQL 캐시 종속성을 구성하는 데 필요한 몇 가지 단계가 있습니다. 첫 번째 단계는 위에서 설명한 대로 데이터베이스와 테이블을 사용하도록 설정하는 것입니다. 해당 단계가 완료되면 나머지 구성은 다음과 같습니다.

  • ASP.NET 구성 파일 구성
  • SqlCacheDependency 구성

ASP.NET 구성 파일 구성

이전 모듈에서 설명한 대로 연결 문자열을 추가하는 것 외에도 아래와 같이 sqlCacheDependency> 요소를 사용하여 <캐시> 요소를 구성<해야 합니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

이 구성을 사용하면 pubs 데이터베이스에 대한 SQL 캐시 종속성을 사용할 수 있습니다. sqlCacheDependency> 요소의 <pollTime 특성은 기본적으로 60000밀리초 또는 1분입니다. (이 값은 500밀리초 미만일 수 없습니다.) 이 예제 <에서 add> 요소는 새 데이터베이스를 추가하고 pollTime을 재정의하여 90000000밀리초로 설정합니다.

SqlCacheDependency 구성

다음 단계는 SqlCacheDependency를 구성하는 것입니다. 이를 수행하는 가장 쉬운 방법은 다음과 같이 @ Outcache 지시문에서 SqlDependency 특성의 값을 지정하는 것입니다.

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

위의 @ OutputCache 지시문에서 PUBS 데이터베이스의 authors 테이블에 대해 SQL 캐시 종속성이 구성됩니다. 다음과 같이 여러 종속성을 세미콜론으로 구분하여 구성할 수 있습니다.

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

SqlCacheDependency를 구성하는 또 다른 방법은 프로그래밍 방식으로 구성하는 것입니다. 다음 코드는 pubs 데이터베이스의 작성자 테이블에 대한 새 SQL 캐시 종속성을 만듭니다.

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

SQL 캐시 종속성을 프로그래밍 방식으로 정의할 때의 이점 중 하나는 발생할 수 있는 예외를 처리할 수 있다는 것입니다. 예를 들어 알림을 사용하도록 설정되지 않은 데이터베이스에 대한 SQL 캐시 종속성을 정의하려고 하면 DatabaseNotEnabledForNotificationException 예외가 throw됩니다. 이 경우 SqlCacheDependencyAdmin.EnableNotifications 메서드를 호출하고 데이터베이스 이름을 전달하여 데이터베이스에서 알림을 사용하도록 설정할 수 있습니다.

마찬가지로 알림을 사용하도록 설정되지 않은 테이블에 대한 SQL 캐시 종속성을 정의하려고 하면 TableNotEnabledForNotificationException 이 throw됩니다. 그런 다음 SqlCacheDependencyAdmin.EnableTableForNotifications 메서드를 호출하여 데이터베이스 이름과 테이블 이름을 전달할 수 있습니다.

다음 코드 샘플에서는 SQL 캐시 종속성을 구성할 때 예외 처리를 올바르게 구성하는 방법을 보여 줍니다.

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

추가 정보: https://msdn.microsoft.com/library/t9x04ed2.aspx

SQL 캐시 종속성 Query-Based(SQL Server 2005만 해당)

SQL 캐시 종속성에 SQL Server 2005를 사용하는 경우 폴링 기반 모델이 필요하지 않습니다. SQL Server 2005에서 사용하는 경우 SQL 캐시 종속성은 SQL Server 2005 쿼리 알림을 사용하여 SQL Server instance 대한 SQL 연결을 통해 직접 통신합니다(추가 구성은 필요하지 않음).

쿼리 기반 알림을 사용하도록 설정하는 가장 간단한 방법은 데이터 원본 개체의 SqlCacheDependency 특성을 CommandNotification 으로 설정하고 EnableCaching 특성을 true로 설정하여 선언적으로 수행하는 것입니다. 이 메서드를 사용하면 코드가 필요하지 않습니다. 데이터 원본에 대해 실행된 명령의 결과가 변경되면 캐시 데이터가 무효화됩니다.

다음 예제에서는 SQL 캐시 종속성에 대한 데이터 원본 제어를 구성합니다.

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

이 경우 SelectCommand 에 지정된 쿼리가 원래와 다른 결과를 반환하면 캐시된 결과가 무효화됩니다.

@ OutputCache 지시문의 SqlDependency 특성을 CommandNotification으로 설정하여 SQL 캐시 종속성에 대해 모든 데이터 원본을 사용하도록 지정할 수도 있습니다. 아래 예제에서는 이를 보여 줍니다.

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

참고

SQL Server 2005의 쿼리 알림에 대한 자세한 내용은 온라인 설명서 SQL Server 참조하세요.

쿼리 기반 SQL 캐시 종속성을 구성하는 또 다른 방법은 SqlCacheDependency 클래스를 사용하여 프로그래밍 방식으로 구성하는 것입니다. 다음 코드 샘플에서는 이 작업을 수행하는 방법을 보여 줍니다.

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

추가 정보: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

캐시 후 대체

페이지를 캐싱하면 웹 애플리케이션의 성능이 크게 향상될 수 있습니다. 그러나 경우에 따라 대부분의 페이지를 캐시해야 하고 페이지 내의 일부 조각이 동적이어야 합니다. 예를 들어 설정된 기간 동안 완전히 정적인 뉴스 기사 페이지를 만드는 경우 전체 페이지를 캐시하도록 설정할 수 있습니다. 모든 페이지 요청에서 변경된 회전 광고 배너를 포함하려면 광고를 포함하는 페이지의 일부가 동적이어야 합니다. 페이지를 캐시할 수 있지만 일부 콘텐츠를 동적으로 대체하려면 캐시 후 대체를 ASP.NET 사용할 수 있습니다. 캐시 후 대체를 사용하면 전체 페이지가 캐싱에서 제외된 것으로 표시된 특정 부분으로 캐시됩니다. 광고 배너 예제에서 AdRotator 컨트롤을 사용하면 각 사용자 및 각 페이지 새로 고침에 대해 광고가 동적으로 생성되도록 캐시 후 대체를 활용할 수 있습니다.

캐시 후 대체를 구현하는 방법에는 세 가지가 있습니다.

  • 선언적으로 대체 컨트롤을 사용 합니다.
  • 프로그래밍 방식으로 대체 컨트롤 API를 사용합니다.
  • 암시적으로 AdRotator 컨트롤을 사용.

대체 컨트롤

ASP.NET 대체 컨트롤은 캐시되지 않고 동적으로 생성된 캐시된 페이지의 섹션을 지정합니다. 동적 콘텐츠를 표시할 페이지의 위치에 대체 컨트롤을 배치합니다. 런타임에 대체 컨트롤은 MethodName 속성을 사용하여 지정하는 메서드를 호출합니다. 메서드는 문자열을 반환해야 합니다. 그러면 대체 컨트롤의 내용이 바뀝니다. 메서드는 포함된 Page 또는 UserControl 컨트롤의 정적 메서드여야 합니다. 대체 컨트롤을 사용하면 클라이언트 쪽 캐시 용이성이 서버 캐시 가능성으로 변경되므로 페이지가 클라이언트에 캐시되지 않습니다. 이렇게 하면 페이지에 대한 이후 요청에서 메서드를 다시 호출하여 동적 콘텐츠를 생성할 수 있습니다.

대체 API

프로그래밍 방식으로 캐시된 페이지에 대한 동적 콘텐츠를 만들려면 페이지 코드에서 WriteSubstitution 메서드를 호출하여 메서드 이름을 매개 변수로 전달할 수 있습니다. 동적 콘텐츠 만들기를 처리하는 메서드는 단일 HttpContext 매개 변수를 사용하고 문자열을 반환합니다. 반환 문자열은 지정된 위치에서 대체될 콘텐츠입니다. 대체 컨트롤을 선언적으로 사용하는 대신 WriteSubstitution 메서드를 호출할 경우 Page 또는 UserControl 개체의 정적 메서드를 호출하지 않고 임의의 개체의 메서드를 호출할 수 있다는 장점이 있습니다.

WriteSubstitution 메서드를 호출하면 클라이언트 쪽 캐시 가능성이 서버 캐시 가능성으로 변경되므로 클라이언트에서 페이지가 캐시되지 않습니다. 이렇게 하면 페이지에 대한 이후 요청에서 메서드를 다시 호출하여 동적 콘텐츠를 생성할 수 있습니다.

AdRotator 컨트롤

AdRotator 서버 컨트롤은 내부적으로 캐시 후 대체에 대한 지원을 구현합니다. 페이지에 AdRotator 컨트롤을 배치하면 부모 페이지가 캐시되었는지 여부에 관계없이 각 요청에 고유한 보급 알림이 렌더링됩니다. 따라서 AdRotator 컨트롤을 포함하는 페이지는 서버 쪽에만 캐시됩니다.

ControlCachePolicy 클래스

ControlCachePolicy 클래스를 사용하면 사용자 컨트롤을 사용하여 조각 캐싱을 프로그래밍 방식으로 제어할 수 있습니다. ASP.NET BasePartialCachingControl instance 사용자 컨트롤을 포함합니다. BasePartialCachingControl 클래스는 출력 캐싱을 사용하도록 설정된 사용자 컨트롤을 나타냅니다.

PartialCachingControl 컨트롤의 BasePartialCachingControl.CachePolicy 속성에 액세스하면 항상 유효한 ControlCachePolicy 개체가 표시됩니다. 그러나 UserControl 컨트롤의 UserControl.CachePolicy 속성에 액세스하는 경우 사용자 컨트롤이 BasePartialCachingControl 컨트롤에 의해 이미 래핑된 경우에만 유효한 ControlCachePolicy 개체를 받게 됩니다. 래핑되지 않은 경우 속성에 의해 반환된 ControlCachePolicy 개체는 연결된 BasePartialCachingControl이 없기 때문에 조작하려고 할 때 예외를 throw합니다. UserControl instance 예외를 생성하지 않고 캐싱을 지원하는지 여부를 확인하려면 SupportsCaching 속성을 검사합니다.

ControlCachePolicy 클래스를 사용하는 것은 출력 캐싱을 사용하도록 설정할 수 있는 여러 가지 방법 중 하나입니다. 다음 목록에서는 출력 캐싱을 사용 하도록 설정 하 여 메서드를 설명 합니다.

  • @ OutputCache 지시문을 사용하여 선언적 시나리오에서 출력 캐싱을 사용하도록 설정합니다.
  • PartialCachingAttribute 특성을 사용하여 코드 숨김 파일에서 사용자 컨트롤에 대한 캐싱을 사용하도록 설정합니다.
  • ControlCachePolicy 클래스를 사용하여 이전 메서드 중 하나를 사용하여 캐시를 사용하도록 설정하고 System.Web.UI.TemplateControl.LoadControl 메서드를 사용하여 동적으로 로드된 BasePartialCachingControl 인스턴스로 작업하는 프로그래밍 방식 시나리오에서 캐시 설정을 지정합니다.

ControlCachePolicy instance 제어 수명 주기의 Init 및 PreRender 단계 간에만 성공적으로 조작할 수 있습니다. PreRender 단계 후에 ControlCachePolicy 개체를 수정하면 컨트롤이 렌더링된 후 변경된 내용이 실제로 캐시 설정에 영향을 줄 수 없으므로 ASP.NET 예외를 throw합니다(컨트롤은 렌더링 단계 중에 캐시됨). 마지막으로 사용자 컨트롤 instance(따라서 ControlCachePolicy 개체)는 실제로 렌더링될 때만 프로그래밍 방식으로 조작할 수 있습니다.

캐싱 구성 변경 내용 - <캐싱> 요소

ASP.NET 2.0에서는 캐싱 구성에 몇 가지 변경 사항이 있습니다. <캐싱> 요소는 ASP.NET 2.0의 새로운 기능이며 구성 파일에서 캐싱 구성을 변경할 수 있습니다. 다음 특성을 사용할 수 있습니다.

요소 설명
캐시 선택적 요소입니다. 전역 애플리케이션 캐시 설정을 정의합니다.
Outputcache 선택적 요소입니다. 애플리케이션 전체 출력 캐시 설정을 지정합니다.
outputCacheSettings 선택적 요소입니다. 애플리케이션의 페이지에 적용할 수 있는 출력 캐시 설정을 지정합니다.
sqlCacheDependency 선택적 요소입니다. ASP.NET 애플리케이션의 SQL 캐시 종속성을 구성합니다.

<cache> 요소

캐시> 요소에서 사용할 수 있는 <특성은 다음과 같습니다.

Attribute 설명
disableMemoryCollection 선택적 부울 특성입니다. 컴퓨터가 메모리 압력을 받고 있을 때 발생하는 캐시 메모리 컬렉션이 비활성화되었는지 여부를 나타내는 값을 가져오거나 설정합니다.
disableExpiration 선택적 부울 특성입니다. 캐시 만료를 사용할 수 없는지 여부를 나타내는 값을 가져오거나 설정합니다. 사용하지 않도록 설정하면 캐시된 항목이 만료되지 않고 만료된 캐시 항목의 백그라운드 청소가 발생하지 않습니다.
privateBytesLimit 선택적 Int64 특성입니다. 캐시가 만료된 항목을 플러시하고 메모리 회수를 시도하기 전에 애플리케이션의 프라이빗 바이트의 최대 크기를 나타내는 값을 가져오거나 설정합니다. 이 제한에는 캐시에서 사용하는 메모리와 실행 중인 애플리케이션의 일반 메모리 오버헤드가 모두 포함됩니다. 0 설정은 ASP.NET 메모리 회수를 시작할 시기를 결정하는 데 자체 추론을 사용함을 나타냅니다.
percentagePhysicalMemoryUsedLimit 선택적 Int32 특성입니다. 캐시가 만료된 항목을 플러시하고 메모리 회수를 시도하기 전에 애플리케이션에서 사용할 수 있는 컴퓨터의 실제 메모리의 최대 백분율을 나타내는 값을 가져오거나 설정합니다. 이 메모리 사용량에는 캐시에서 사용하는 메모리와 실행 중인 애플리케이션의 일반 메모리 사용량이 모두 포함됩니다. 0 설정은 ASP.NET 메모리 회수를 시작할 시기를 결정하는 데 자체 추론을 사용함을 나타냅니다.
privateBytesPollTime 선택적 TimeSpan 특성입니다. 애플리케이션의 프라이빗 바이트 메모리 사용량에 대한 폴링 사이의 시간 간격을 나타내는 값을 가져오거나 설정합니다.

<outputCache> 요소

outputCache> 요소에 사용할 수 있는 <특성은 다음과 같습니다.

Attribute 설명
enableOutputCache 선택적 부울 특성입니다. 페이지 출력 캐시를 사용하거나 사용하지 않도록 설정합니다. 사용하지 않도록 설정하면 프로그래밍 방식 또는 선언적 설정에 관계없이 페이지가 캐시되지 않습니다. 기본값은 True입니다.
enableFragmentCache 선택적 부울 특성입니다. 애플리케이션 조각 캐시를 사용하거나 사용하지 않도록 설정합니다. 사용하지 않도록 설정하면 사용된 @ OutputCache 지시문 또는 캐싱 프로필에 관계없이 페이지가 캐시되지 않습니다. 업스트림 프록시 서버와 브라우저 클라이언트가 페이지 출력을 캐시하려고 시도해서는 안 됨을 나타내는 캐시 제어 헤더를 포함합니다. 기본값은 false입니다.
sendCacheControlHeader 선택적 부울 특성입니다. 기본적으로 출력 캐시 모듈에서 cache-control:private 헤더를 보낼지 여부를 나타내는 값을 가져오거나 설정합니다. 기본값은 false입니다.
omitVaryStar 선택적 부울 특성입니다. 응답에서 Http "Vary: </strong>" 헤더 전송을 사용하거나 사용하지 않도록 설정합니다. 기본 설정이 false이면 출력 캐시된 페이지에 대해 "*Vary: *" 헤더가 전송됩니다. Vary 헤더를 보내면 Vary 헤더에 지정된 내용에 따라 다른 버전을 캐시할 수 있습니다. 예를 들어 Vary:User-Agents는 요청을 발급하는 사용자 에이전트에 따라 페이지의 다른 버전을 저장합니다. 기본값은 **false입니다.

<outputCacheSettings> 요소

<outputCacheSettings> 요소를 사용하면 앞에서 설명한 대로 캐시 프로필을 만들 수 있습니다. outputCacheSettings 요소에 <대한 유일한 자식 요소는 캐시 프로필을 구성하기 위한 outputCacheProfiles> 요소입니다<.>

<sqlCacheDependency> 요소

sqlCacheDependency> 요소에 <사용할 수 있는 특성은 다음과 같습니다.

Attribute 설명
enabled 필수 부울 특성입니다. 변경 내용이 폴링되는지 여부를 나타냅니다.
pollTime 선택적 Int32 특성입니다. SqlCacheDependency가 데이터베이스 테이블에 변경 내용을 폴링하는 빈도를 설정합니다. 이 값은 연속 폴링 간의 밀리초 수에 해당합니다. 500밀리초 미만으로 설정할 수 없습니다. 기본값은 1분입니다.

추가 정보

캐시 구성과 관련하여 알아야 할 몇 가지 추가 정보가 있습니다.

  • 작업자 프로세스 프라이빗 바이트 제한이 설정되지 않은 경우 캐시는 다음 제한 중 하나를 사용합니다.

    • x86 2GB: 실제 RAM의 800MB 또는 60% 중 더 적은 값
    • x86 3GB: 1800MB 또는 실제 RAM의 60% 중 더 적은 값
    • x64: 1테라바이트 또는 실제 RAM의 60% 중 더 적은 수
  • 작업자 프로세스 프라이빗 바이트 제한 및 <캐시 privateBytesLimit/> 가 모두 설정된 경우 캐시는 최소 2개를 사용합니다.

  • 1.x와 마찬가지로 캐시 항목을 삭제하고 GC를 호출합니다. 다음 두 가지 이유로 수집합니다.

    • 프라이빗 바이트 제한에 매우 가깝습니다.
    • 사용 가능한 메모리가 10% 가까이 있거나 10% 미만입니다.
  • 캐시 백분율PhysicalMemoryUseLimit/>를 100으로 설정<하여 사용 가능한 메모리 부족 조건에 대해 트리밍 및 캐시를 효과적으로 사용하지 않도록 설정할 수 있습니다.

  • 1.x와 달리 2.0은 트리밍을 일시 중단하고 마지막 GC인 경우 호출을 수집합니다. 수집은 프라이빗 바이트 또는 관리되는 힙의 크기를 (캐시) 메모리 제한의 1% 이상 줄이지 않았습니다.

랩1: 사용자 지정 캐시 종속성

  1. 새 웹 사이트를 만듭니다.

  2. cache.xml 라는 새 XML 파일을 추가하고 웹 애플리케이션의 루트에 저장합니다.

  3. default.aspx의 코드 숨김에서 Page_Load 메서드에 다음 코드를 추가합니다.

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. 원본 뷰에서 default.aspx의 맨 위에 다음을 추가합니다.

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. Default.aspx를 찾습니다. 시간은 무엇을 말합니까?

  6. 브라우저를 새로 고칩니다. 시간은 무엇을 말합니까?

  7. cache.xml 열고 다음 코드를 추가합니다.

    <anElement></anElement>
    
  8. cache.xml 저장합니다.

  9. 브라우저를 새로 고칩니다. 시간은 무엇을 말합니까?

  10. 이전에 캐시된 값을 표시하는 대신 시간이 업데이트된 이유를 설명합니다.

랩 2: Polling-Based 캐시 종속성 사용

이 랩에서는 GridView 및 DetailsView 컨트롤을 통해 Northwind 데이터베이스의 데이터를 편집할 수 있도록 이전 모듈에서 만든 프로젝트를 사용합니다.

  1. Visual Studio 2005에서 프로젝트를 엽니다.

  2. Northwind 데이터베이스에 대해 aspnet_regsql 유틸리티를 실행하여 데이터베이스와 Products 테이블을 사용하도록 설정합니다. Visual Studio 명령 프롬프트에서 다음 명령을 사용합니다.

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. web.config 파일에 다음을 추가합니다.

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. showdata.aspx라는 새 웹 폼을 추가합니다.

  5. showdata.aspx 페이지에 다음 @ outputcache 지시문을 추가합니다.

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. showdata.aspx의 Page_Load 다음 코드를 추가합니다.

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. showdata.aspx에 새 SqlDataSource 컨트롤을 추가하고 Northwind 데이터베이스 연결을 사용하도록 구성합니다. 다음을 클릭합니다.

  8. ProductName 및 ProductID 확인란을 선택하고 다음을 클릭합니다.

  9. 마침을 클릭합니다.

  10. showdata.aspx 페이지에 새 GridView를 추가합니다.

  11. 드롭다운에서 SqlDataSource1을 선택합니다.

  12. showdata.aspx를 저장하고 찾아봅니다. 표시된 시간을 기록해 둡다.