Изучение кэширования в ASP.NET - Возможность кэширования в ASP.NET

ОГЛАВЛЕНИЕ

Возможность кэширования в ASP.NET

ASP.NET поддерживает кэширование страницы, неполной страницы (фрагмента) и кэширование данных. Кэширование динамически генерируемой страницы называется кэшированием вывода страницы. При кэшировании страницы, когда кэшируется динамически генерируемая страница, к ней обращаются только в первый раз. Любое последующее обращение к той же самой странице будет возвращаться из кэша. ASP.NET также позволяет кэшировать часть страницы, что называется кэшированием неполной страницы или кэшированием фрагмента. Кэшируются другие данные сервера (например, данные сервера SQL, данные XML), к которым можно легко обратиться без повторного извлечения данных с помощью кэширования данных. Кэширование уменьшает число запросов «туда-обратно» к базе данных и другим источникам данных. ASP.NET предоставляет полноценный механизм кэширования данных, снабженный поддержкой уборки мусора (на базе приоритета кэша), истечения, зависимостей от файла, ключа и времени. Есть два места, где кэширование может использоваться для повышения производительности приложений ASP.NET.

 

Рис 6: Возможность кэширования в ASP.NET

На рисунке выше (1) используется для возвратного кэширования страницы, то есть он используется в кэшировании вывода, и (2) избавляет от передачи данных туда-обратно путем хранения данных с помощью кэширования данных.

ASP.NET поддерживает два типа политик истечения, определяющих, когда объект истекает или удаляется из кэша.

Абсолютное истечение: Определяет, что истечения происходят в указанное время. Абсолютные истечения задаются в формате полного времени (чч:мм:сс). Объект будет удален из кэша в указанное время.

Разные типы кэширования

ASP.NET поддерживает три типа кэширования:
1.    Кэширование вывода страницы [кэширование вывода]
2.    Кэширование фрагмента [кэширование вывода]
3.    Кэширование данных

Кэширование вывода страницы

Чтобы  начать кэширование вывода страницы, надо знать процесс компиляции страницы, потому что исходя из генерации страницы можно понять, почему следует использовать кэширование. Процесс компиляции страницы ASPX двухэтапный. Сначала код компилируется в промежуточный язык Microsoft (MSIL). Далее MSIL компилируется в собственный код (оперативным компилятором) при выполнении. Весь код в странице ASP.NET компилируется в MSIL при построении сайтов, но в момент выполнения преобразуется в собственный код только часть MSIL, необходимая пользователю, и выполняются запросы пользователя, что повышает производительность.

 

Рис. 7: Процесс выполнения страницы ASP.NET

Если страница часто меняется, оперативному компилятору приходится каждый раз ее компилировать. Можно использовать кэширование вывода страницы для страниц с относительно статичным содержимым. Вместо того чтобы генерировать страницу при каждом запросе пользователя, можно кэшировать страницу с помощью кэширования вывода страницы, чтобы к ней обращались из самого кэша. Страницы могут генерироваться однажды и кэшироваться для последующих извлечений. Кэширование вывода страницы позволяет хранить в кэше все содержимое данной страницы.

 

Рис. 8: Кэширование вывода страницы

На рисунке при генерации первого запроса кэшируется страница, и для дальнейших запросов той же страницы страница извлекается из кэша вместо повторной генерации страницы.

Для кэширования вывода директива OutputCache добавляется на любую страницу ASP.NET с заданием длительности (в секундах) кэширования страницы.

Пример

<%@ Page Language="C#" %>
<%@ OutputCache Duration='300' VaryByParam='none' %>
<html>

  <script runat="server">
    protected void Page_Load(Object sender, EventArgs e) {
        lbl_msg.Text = DateTime.Now.ToString();
    }
  </script>

  <body>
    <h3>Output Cache example</h3>
    <p>Page generated on:
       <asp:label id="lbl_msg" runat="server"/></p>
  </body>
</html>

Также можно установить свойство кэширования из отделенного кода:

void Page_Load(Object sender, EventArgs e) {
      Response.Cache.SetExpires(DateTime.Now.AddSeconds(360));
      Response.Cache.SetCacheability(
                   HttpCacheability.Public);
      Response.Cache.SetSlidingExpiration(true);
      _msg.Text = DateTime.Now.ToString();
}

Надо указать длительность и атрибут VaryByParam. Длительность определяет, как долго кэш будет сохраняться. VaryByParam определяет, меняется ли кэш со значениями параметра.

 

Рис. 9: Кэширование нескольких страниц на базе параметров

Как показано на рисунке выше, если для страницы используется строка запроса, и надо кэшировать все страницы на базе строки запроса, то придется использовать атрибут VaryByParam кэширования вывода. На базе строки запроса данные должны кэшироваться, и когда пользователь запрашивает страницу со строкой запроса (ID на рисунке), страница извлекается из кэша. Следующий пример описывает использование атрибутов VaryByParam.

Пример:

<%@ OutputCache Duration="60" VaryByParam="*" %>
<! страница будет находиться в кэше 60 секунд, и создастся отдельная запись
   кэша для каждого варианта строки запроса -->

Следующая таблица показывает самые распространенные и самые важные атрибуты кэша вывода:

Атрибут

Значения

Описание

Duration

число

Определяет, как долго страница будет кэшированной (в секундах).

Location

'любое'

'клиент'

'ниже'

'сервер'

'нет'

Определяет местоположение кэша страницы. Далее рассматривается подробно.

VaryByCustom

'браузер'

Менять кэш вывода по имени и версии браузера или по пользовательской строке.

VaryByParam

'нет' '*'

Обязательный атрибут, требуемый для параметра для страницы. Уже был рассмотрен.

Все атрибуты, указанные в директиве OutputCache, используются для заполнения экземпляра класса System.Web.HttpCachePolicy. Полная реализация политик кэширования, предоставляемых ASP.NET, инкапсулирована в классе HttpCachePolicy. Далее идет еще одна реализация кэширования из отделенного кода.

Место кэширования вывода

Как сказано ранее, можно хранить кэшированные данные в разных местах, таких как клиент, сервер или между клиентом и сервером. Далее рассказано, как установить местоположение кэшированных данных. Хранение кэшированных данных экономит время отображения страницы за счет извлечения данных из кэша. Есть еще один способ сохранения кэшированных данных в браузере клиента, уменьшающий сетевой трафик. Директива OutputCache на странице активирует все три типа кэширования — сервер, клиент и прокси — по умолчанию.

Следующая таблица показывает детали местоположения. Она показывает местоположение кэша и действия заголовков Cache-Control(управление кэшированием) и Expires(истекает).

Значение местоположения

Заголовок Cache-Control

Заголовок  Expires

Страница кэшируется на сервере

Описание

'любое'

public (открытый)

да

да

Страница кэшируется в браузере клиента, на последующем сервере, или на сервере.

'клиент'

private (закрытый)

да

нет

Страница кэшируется только в браузере клиента.

'ниже'

public

да

нет

Страница кэшируется на последующем сервере и клиенте.

'сервер'

no-cache

(не кэшировать)

нет

да

Страница кэшируется только на сервере.

'нет'

no-cache

нет

нет

Отключает кэширование вывода для этой страницы.

Например, если указать значение Client для атрибута Location директивы OutputCache на странице –  страница не будет сохраняться в кэше сервера, но ответ будет содержать заголовок Cache-Control (страницы могут указывать, должны ли они кэшироваться в прокси, с помощью заголовка Cache-Control) со значением private и заголовок Expires (ответ HTTP, указывающий дату и время, после которого страница должна быть снова извлечена с сервера) с временной меткой, установленной во время, указанное атрибутом Duration.

Пример

<%@ OutputCache Duration='120' Location='Client' VaryByParam='none' %>

Это сохранит кэш на 120 секунд, и кэшированные данные не должны сохраняться на сервере, они должны храниться только в браузере клиента.