Учебники

ASP.NET — кеширование данных

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

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

Кэширование помещает часто используемые данные в быстро доступные носители, такие как оперативная память компьютера. Среда выполнения ASP.NET включает в себя карту ключ-значение объектов CLR, которая называется кеш. Это находится в приложении и доступно через HttpContext и System.Web.UI.Page.

В некотором отношении кэширование похоже на хранение объектов состояния. Однако хранение информации в объектах состояния является детерминированным, то есть вы можете рассчитывать на данные, которые там хранятся, а кэширование данных недетерминировано.

Данные не будут доступны в следующих случаях:

  • Если его время жизни истекает,
  • Если приложение освобождает свою память,
  • Если кеширование не происходит по какой-то причине.

Вы можете получить доступ к элементам в кеше, используя индексатор, и можете управлять временем жизни объектов в кеше и устанавливать связи между кешированными объектами и их физическими источниками.

Кеширование в ASP.Net

ASP.NET предоставляет следующие различные типы кэширования:

  • Кэширование вывода : Кэширование вывода хранит копию окончательно отрисованных HTML-страниц или часть страниц, отправленных клиенту. Когда следующий клиент запрашивает эту страницу, вместо ее регенерации отправляется кэшированная копия страницы, что экономит время.

  • Кэширование данных. Кэширование данных означает кеширование данных из источника данных. Пока срок действия кэша не истек, запрос данных будет выполняться из кэша. Когда срок действия кеша истек, источник данных получает свежие данные и кеш пополняется.

  • Кэширование объектов. Кэширование объектов — это кэширование объектов на странице, таких как элементы управления с привязкой к данным. Кэшированные данные хранятся в памяти сервера.

  • Кэширование классов : веб-страницы или веб-службы компилируются в класс страниц в сборке при первом запуске. Затем сборка кэшируется на сервере. В следующий раз, когда будет сделан запрос на страницу или службу, ссылка на кэшированную сборку. Когда исходный код изменяется, CLR перекомпилирует сборку.

  • Кэширование конфигурации: информация о конфигурации всего приложения хранится в файле конфигурации. Кэширование конфигурации сохраняет информацию о конфигурации в памяти сервера.

Кэширование вывода : Кэширование вывода хранит копию окончательно отрисованных HTML-страниц или часть страниц, отправленных клиенту. Когда следующий клиент запрашивает эту страницу, вместо ее регенерации отправляется кэшированная копия страницы, что экономит время.

Кэширование данных. Кэширование данных означает кеширование данных из источника данных. Пока срок действия кэша не истек, запрос данных будет выполняться из кэша. Когда срок действия кеша истек, источник данных получает свежие данные и кеш пополняется.

Кэширование объектов. Кэширование объектов — это кэширование объектов на странице, таких как элементы управления с привязкой к данным. Кэшированные данные хранятся в памяти сервера.

Кэширование классов : веб-страницы или веб-службы компилируются в класс страниц в сборке при первом запуске. Затем сборка кэшируется на сервере. В следующий раз, когда будет сделан запрос на страницу или службу, ссылка на кэшированную сборку. Когда исходный код изменяется, CLR перекомпилирует сборку.

Кэширование конфигурации: информация о конфигурации всего приложения хранится в файле конфигурации. Кэширование конфигурации сохраняет информацию о конфигурации в памяти сервера.

В этом руководстве мы рассмотрим кеширование вывода, кеширование данных и кеширование объектов.

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

Рендеринг страницы может включать в себя некоторые сложные процессы, такие как доступ к базе данных, рендеринг сложных элементов управления и т. Д. Кэширование вывода позволяет обходить обходы сервера, кэшируя данные в памяти. Даже вся страница может быть кэширована.

Директива OutputCache отвечает за кэширование вывода. Он включает кэширование вывода и обеспечивает определенный контроль над его поведением.

Синтаксис для директивы OutputCache:

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

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

protected void Page_Load(object sender, EventArgs e)
{
   Thread.Sleep(10000);  
   Response.Write("This page was generated and cache at:" +
   DateTime.Now.ToString());
}

Метод Thread.Sleep () останавливает поток процесса на указанное время. В этом примере поток останавливается на 10 секунд, поэтому при первой загрузке страницы это занимает 10 секунд. Однако при следующем обновлении страницы это не займет времени, поскольку страница извлекается из кэша без загрузки.

Директива OutputCache имеет следующие атрибуты, которые помогают контролировать поведение выходного кэша:

атрибут Ценности Описание
DiskCacheable истина / ложь Указывает, что выходные данные могут быть записаны в дисковый кэш.
NoStore истина / ложь Указывает, отправляется или нет заголовок элемента управления кэшем «без хранилища».
CacheProfile Имя строки Имя профиля кеша для хранения в web.config.
VaryByParam

Никто

*

Param-имя

Список строк, разделенных точкой с запятой, задает значения строки запроса в запросе GET или переменную в запросе POST.
VaryByHeader

*

Названия заголовков

Список строк, разделенных точкой с запятой, определяет заголовки, которые могут быть отправлены клиентом.
VaryByCustom

браузер

Пользовательская строка

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

любой

клиент

вниз по течению

сервер

Никто

Любое: страница может кэшироваться где угодно.

Клиент: кэшированный контент остается в браузере.

Downstream: кэшированный контент, хранящийся в downstream и на сервере.

Сервер: кэшированный контент сохраняется только на сервере.

Нет: отключает кеширование.

продолжительность Число Количество секунд, в течение которых страница или элемент управления кэшируются.

Никто

*

*

Названия заголовков

браузер

Пользовательская строка

любой

клиент

вниз по течению

сервер

Никто

Любое: страница может кэшироваться где угодно.

Клиент: кэшированный контент остается в браузере.

Downstream: кэшированный контент, хранящийся в downstream и на сервере.

Сервер: кэшированный контент сохраняется только на сервере.

Нет: отключает кеширование.

Давайте добавим текстовое поле и кнопку к предыдущему примеру и добавим этот обработчик события для кнопки.

protected void btnmagic_Click(object sender, EventArgs e)
{
   Response.Write("<br><br>");
   Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>");
}

Измените директиву OutputCache:

<%@ OutputCache Duration="60" VaryByParam="txtname" %>

Когда программа выполняется, ASP.NET кэширует страницу на основе имени в текстовом поле.

Кеширование данных

Основным аспектом кэширования данных является кэширование элементов управления источником данных. Мы уже обсуждали, что элементы управления источником данных представляют данные в источнике данных, таком как база данных или файл XML. Эти элементы управления являются производными от абстрактного класса DataSourceControl и имеют следующие унаследованные свойства для реализации кэширования:

  • CacheDuration — устанавливает количество секунд, в течение которых источник данных будет кэшировать данные.

  • CacheExpirationPolicy — определяет поведение кэша после истечения срока действия данных в кэше.

  • CacheKeyDependency — определяет ключ для элементов управления, который автоматически удаляет содержимое своего кэша при удалении.

  • EnableCaching — указывает, следует ли кэшировать данные.

CacheDuration — устанавливает количество секунд, в течение которых источник данных будет кэшировать данные.

CacheExpirationPolicy — определяет поведение кэша после истечения срока действия данных в кэше.

CacheKeyDependency — определяет ключ для элементов управления, который автоматически удаляет содержимое своего кэша при удалении.

EnableCaching — указывает, следует ли кэшировать данные.

пример

Чтобы продемонстрировать кеширование данных, создайте новый веб-сайт и добавьте на него новую веб-форму. Добавьте элемент управления SqlDataSource с подключением к базе данных, уже используемым в руководствах по доступу к данным.

Для этого примера добавьте на страницу метку, которая будет показывать время ответа для страницы.

<asp:Label ID="lbltime" runat="server"></asp:Label>

Помимо метки, страница контента такая же, как в учебнике по доступу к данным. Добавьте обработчик события для загрузки страницы:

protected void Page_Load(object sender, EventArgs e)
{
   lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());
}

Разработанная страница должна выглядеть так, как показано:

Кеширование данных

Когда вы запускаете страницу в первый раз, ничего не происходит, метка показывает, что каждый раз, когда вы обновляете страницу, страница перезагружается и время, указанное на метке, изменяется.

Затем установите для атрибута EnableCaching элемента управления источником данных значение «true» и установите для атрибута Cacheduration значение «60». Он реализует кеширование, и срок его действия истекает каждые 60 секунд.

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

<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" 
   ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" 
   ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" 
   SelectCommand = "SELECT * FROM [DotNetReferences]"
   EnableCaching = "true" CacheDuration = "60">         
</asp:SqlDataSource>

Кеширование объектов

Кеширование объектов обеспечивает большую гибкость, чем другие методы кеширования. Вы можете использовать кеширование объектов, чтобы поместить любой объект в кеш. Объект может быть любого типа — тип данных, веб-элемент управления, класс, объект набора данных и т. Д. Элемент добавляется в кэш, просто назначая новое имя ключа, как показано ниже:

Cache["key"] = item;

ASP.NET также предоставляет метод Insert () для вставки объекта в кеш. Этот метод имеет четыре перегруженные версии. Давайте посмотрим на них:

перегрузка Описание
Cache.Insert ((ключ, значение); Вставляет элемент в кэш с именем и значением ключа с приоритетом и сроком действия по умолчанию.
Cache.Insert (ключ, значение, зависимости); Вставляет элемент в кэш с ключом, значением, приоритетом по умолчанию, сроком действия и именем CacheDependency, который ссылается на другие файлы или элементы, чтобы при их изменении элемент кэша больше не действовал.
Cache.Insert (ключ, значение, зависимости, absoluteExpiration, slideExpiration); Это указывает на политику истечения срока действия наряду с вышеуказанными проблемами.
Cache.Insert (ключ, значение, зависимости, absoluteExpiration, slideExpiration, priority, onRemoveCallback); Это, наряду с параметрами, также позволяет вам установить приоритет для элемента кэша и делегата, который указывает на метод, который будет вызываться при удалении элемента.

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

Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

пример

Создайте страницу с помощью только кнопки и метки. Напишите следующий код в событии загрузки страницы:

protected void Page_Load(object sender, EventArgs e)
{
   if (this.IsPostBack)
   {
      lblinfo.Text += "Page Posted Back.<br/>";
   }
   else
   {
      lblinfo.Text += "page Created.<br/>";
   }
   
   if (Cache["testitem"] == null)
   {
      lblinfo.Text += "Creating test item.<br/>";
      DateTime testItem = DateTime.Now;
      lblinfo.Text += "Storing test item in cache ";
      lblinfo.Text += "for 30 seconds.<br/>";
      Cache.Insert("testitem", testItem, null, 
      DateTime.Now.AddSeconds(30), TimeSpan.Zero);
   }
   else
   {
      lblinfo.Text += "Retrieving test item.<br/>";
      DateTime testItem = (DateTime)Cache["testitem"];
      lblinfo.Text += "Test item is: " + testItem.ToString();
      lblinfo.Text += "<br/>";
   }
      
   lblinfo.Text += "<br/>";
}

Когда страница загружается в первый раз, она говорит:

Page Created.
Creating test item.
Storing test item in cache for 30 seconds.

Если вы снова нажмете кнопку в течение 30 секунд, страница будет отправлена ​​обратно, но элемент управления меткой получит информацию из кэша, как показано ниже: