Содержание
- Tag-хэлпер CacheTagHelper
- Примеры кэширования в памяти с использованием CacheTagHelper
- Настройка политики абсолютного истечения срока действия кэша
- Настройка политики скользящего истечения срока действия кэша
- Настройка времени кэширования с момента первого обращения к элементу кэша
- Настройка комбинированного времени истечения срока действия кэша
- Создание версий кэша в зависимости от различных параметров
- Приоритет кэшируемых элементов
- Итого
Tag-хэлпер CacheTagHelper
представлен в ASP.NET Core MVC тэгом <cache>
и позволяет кэшировать заданную часть представления в памяти сервера.
Прежде, чем рассмотрим работу этого tag-хэлпера, стоит напомнить то, что касается кэширования вообще, а именно — кэшировать стоит ту информацию, которая не изменяется вообще или же изменяется крайне редко, например, аватары пользователей, какие-то изображения и т.д. Примеры, представленные ниже, используют для кэширования данные, которые, напротив, меняются довольно часто. Это сделано исключительно для демонстрации работы tag-хэлпера
Tag-хэлпер CacheTagHelper
Для этого tag-хэлпера могу использоваться следующие атрибуты:
Атрибут | Описание |
enabled |
определяет, кэшируется ли содержимое, охватываемое тэгом <cache> . Значение по умолчанию — true . |
|
задает абсолютную дату окончания срока действия для элемента кэша |
|
задает интервал времени для кэширования содержимого с момента первого запроса |
|
задает время, по истечении которого запись кэша следует удалить, если к ней не было обращений. |
|
принимает список разделенных запятыми значений заголовков, запускающих обновление кэша при их изменении |
|
принимает список разделенных запятыми ключей в строке запроса, запускающих обновление кэша при изменении значения любого указанного ключа |
vary-by-route |
принимает список разделенных запятыми имен параметров маршрута, запускающих обновление кэша при изменении значения параметра данных маршрута |
vary-by-cookie |
принимает список cookie имен с разделителями-запятыми, которые активируют обновление кэша при изменении значений cookie |
|
указывает, следует ли сбрасывать кэш при изменении вошедшего в систему пользователя |
|
позволяет настраивать, какие данные кэшируются |
|
предоставляет встроенному поставщику кэша инструкции по удалению кэша. При нехватке памяти веб-сервер будет первыми удалять записи кэша с приоритетом 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>
вторя строка времени не кэшируется. Таким образом, при первом запуске обе строки должны содержать одно и то же время, но, после обновления страницы мы увидим, что первая строка не изменяется, так как данные будут извлекаться из кэша. Запустим приложение и проверим его работу. Первый запуск:
Обновим страницу, спустя некоторое время:
Настройка политики абсолютного истечения срока действия кэша
В соответствии с этой политикой, элемент кэша удаляется из памяти через заданный промежуток времени, не смотри ни на что. Для настройки этой политики используется атрибут 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 секунд к нему не будет обращения. Пока мы обращаемся к кэшу, например, обновляем страницу, элемент кэша будет «висеть» в памяти. Проверить работу этого атрибута необходимо:
- запустить приложение и обновить главную страницу один раз, чтобы элемент был помещен в кэш
- обновить страницу ещё раз и убедиться, что время в первой строке было взято из кэша
- подождать минуту и снова обновить страницу — в этот момент время и в первой и во второй строке будет иметь одно и то же значение. При этом, новое значение времени снова будет помещено в кэш и время истечения срока действия снова обновится
Настройка времени кэширования с момента первого обращения к элементу кэша
Для настройки этого параметра используется атрибут 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>
и, в зависимости от заданных атрибутов, позволяет создавать различные версии кэшируемых элементов, задавать политики кэширования и приоритет элементов при очистке памяти.