Tag-хэлперы в ASP.NET Core MVC. CacheTagHelper

Tag-хэлпер CacheTagHelper представлен в ASP.NET Core MVC тэгом <cache> и позволяет кэшировать заданную часть представления в памяти сервера.

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

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

Tag-хэлпер CacheTagHelper 

Для этого tag-хэлпера могу использоваться следующие атрибуты:

Атрибут Описание
enabled определяет, кэшируется ли содержимое, охватываемое тэгом <cache>. Значение по умолчанию — true.

expires-on

задает абсолютную дату окончания срока действия для элемента кэша

expires-after

задает интервал времени для кэширования содержимого с момента первого запроса

expires-sliding

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

vary-by-header

принимает список разделенных запятыми значений заголовков, запускающих обновление кэша при их изменении

vary-by-query

принимает список разделенных запятыми ключей в строке запроса, запускающих обновление кэша при изменении значения любого указанного ключа
vary-by-route принимает список разделенных запятыми имен параметров маршрута, запускающих обновление кэша при изменении значения параметра данных маршрута
vary-by-cookie принимает список cookie имен с разделителями-запятыми, которые активируют обновление кэша при изменении значений cookie

vary-by-user

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

vary-by

позволяет настраивать, какие данные кэшируются

priority

предоставляет встроенному поставщику кэша инструкции по удалению кэша. При нехватке памяти веб-сервер будет первыми удалять записи кэша с приоритетом Low

 

Примеры кэширования в памяти с использованием CacheTagHelper 

Чтобы продемонстрировать кэширование элементов представления в памяти создадим новое приложение ASP.NET Core MVC и изменим представление Views/Home/Index.cshtml следующим образом:

@{
    ViewData["Title"] = "Home Page";
}

<cache>
    Время из кэша: @DateTime.Now;
</cache>
<p>
    Время: @DateTime.Now;
</p>

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

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

<cache> 
   Время из кэша: @DateTime.Now; 
</cache>

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

CacheTagHelper Обновим страницу, спустя некоторое время:

Настройка политики абсолютного истечения срока действия кэша

В соответствии с этой политикой, элемент кэша удаляется из памяти через заданный промежуток времени, не смотри ни на что.  Для настройки этой политики используется атрибут expires-on. Вернемся к нашему приложению и воспользуемся этим атрибутом:

<cache expires-on="@new DateTime(2023,11,26,0,50,0)">
    Время из кэша: @DateTime.Now;
</cache>

В данном случае. мы задаем абсолютное время истечения срока действия элемента кэша 26 ноября 2023 года 00:50:00. До этого времени элемент времени в первой строке будет извлекаться из кэша:

После того как наступает время истечения жизни элемента кэша мы получаем текущее время и с этого момента элемент в кэш уже не помещается:

 

Настройка политики скользящего истечения срока действия кэша

В соответствии с этой политикой, элемент кэша удаляется, если к нему не был осуществлен доступ в течение определенного периода времени. Для настройки этой политики используется атрибут expires-sliding. Например, настроим наш элемент кэша следующим образом:

<cache expires-sliding="@TimeSpan.FromSeconds(60)">
    Время из кэша: @DateTime.Now;
</cache>

Таким образом, элемент кэша будет удален из памяти только в том случае, если в течение 60 секунд к нему не будет обращения. Пока мы обращаемся к кэшу, например, обновляем страницу, элемент кэша будет «висеть» в памяти. Проверить работу этого атрибута необходимо:

  1. запустить приложение и обновить главную страницу один раз, чтобы элемент был помещен в кэш
  2. обновить страницу ещё раз и убедиться, что время в первой строке было взято из кэша
  3. подождать минуту и снова обновить страницу — в этот момент время и в первой и во второй строке будет иметь одно и то же значение. При этом, новое значение времени снова будет помещено в кэш и время истечения срока действия снова обновится

Настройка времени кэширования с момента первого обращения к элементу кэша

Для настройки этого параметра используется атрибут expires-after. Например:

<cache expires-after="@TimeSpan.FromSeconds(60)">
    Время из кэша: @DateTime.Now;
</cache>

в этом случае элемент кэша будет удален из памяти через минуту после первого обращения к нему. Через одну минуту старый элемент кэша будет удален, а на его место помещен новый.

Настройка комбинированного времени истечения срока действия кэша

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

<cache expires-sliding="@TimeSpan.FromSeconds(60)" expires-on="@new DateTime(2023,11,27,0,0,0)">
    Время из кэша: @DateTime.Now;
</cache>

если к элементу кэша не будет обращений в течение 60 секунд, то он будет удален. При этом, в любом случае, элемент кэша удалится из памяти 27.11.2023 в 00:00:00.

Создание версий кэша в зависимости от различных параметров

Также, tag-хэлпер CacheTagHelper позволяет создавать различные версии кэша в зависимости от различных параметров. Для этого используются атрибуты vary-by-*. например, если нам необходимо, чтобы элемент кэша создавался отдельно для каждого пользователя, вошедшего в систему, то мы можем воспользоваться атрибутом vary-by-user:

<cache vary-by-user="true">
    Время из кэша: @DateTime.Now;
</cache>

Если элемент кэша зависит от параметра маршрута, то мы можем воспользоваться атрибутом vary-by-route:

<cache vary-by-user="true" vary-by-route="id,action">
    Время из кэша: @DateTime.Now;
</cache>

таким образом, если у маршрута поменяется параметр id или action, то будет создана новая версия кэша. Аналогичным образом, мы можем создавать различные версии кэша в зависимости от значения элемента в строке запроса (query), используя атрибут vary-by-query:

<cache vary-by-query="name">
    Время из кэша: @DateTime.Now;
</cache>

Например, для запроса вида:

localhost:7123/Home/Index?name=Bob 

и

localhost:7123/Home/Index?name=Tom

будут созданы две различные версии кэша, что легко проверить:

Походим образом действуют и другие атрибуты вида vary-by-*, позволяя создавать свои версии кэша в зависимости от значений заголовков, кук и т.д.

Приоритет кэшируемых элементов

В приложении мы можем предусмотреть различное количество кэшируемых элементов. Это могут быть картинки, данные расчётов и т.д. Каждый из этих элементов займет свое место в памяти сервера, что, в конечном счёте, может привести к тому, что для сохранения очередного элемента просто не хватит места. Поэтому, в ASP.NET Core MVC, как и в «чистом» ASP.NET Core действует своя система очистки памяти в зависимости от приоритета элемента. В соответствии с этой политикой, каждый элемент кэша может иметь свой приоритет. Например, результаты трудоемких расчётов для нас будут иметь явно приоритет выше, чем, например, кэшированный аватар пользователя. Всего выделяется четыре приоритета:

Low 0 Запись кэша должна быть удалена как можно скорее во время очистки, активировав нехватку памяти.
Normal 1 Запись кэша должна быть удалена, если во время очистки, активировавшейся нехваткой памяти, отсутствуют другие записи кэша с низким приоритетом.
High 2 Запись кэша должна удаляться только в том случае, если во время очистки, активировавшейся нехваткой памяти, отсутствуют другие записи кэша с низким или нормальным приоритетом.
NeverRemove 3 Запись кэша никогда не должна удаляться во время очистки, вызываемой нехваткой памяти.

Таким образом, в первую очередь будут удаляться элементы с приоритетом Low, затем — с Normal и т.д. Установить приоритет элемента кэша мы можем с использованием атрибута priority:

<cache priority="Microsoft.Extensions.Caching.Memory.CacheItemPriority.Low">
    Время из кэша: @DateTime.Now;
</cache>

Итого

Tag-хэлпер CacheTagHelper позволяет кэшировать отдельные элементы представлений в памяти. Этот хэлпер представлен в ASP.NET Core MVC тэгом <cache> и, в зависимости от заданных атрибутов, позволяет создавать различные версии кэшируемых элементов, задавать политики кэширования и приоритет элементов при очистке памяти.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии