Tag-хэлперы в ASP.NET Core MVC. Распределенное кэширование (DistributedCacheTagHelper)

Помимо обычного кэширования в памяти с использованием tag-хэлпера CacheTagHelper, в ASP.NET Core MVC мы также можем задействовать распределенное кэширование с использованием какого-либо внешнего источника. Для этого используется tag-хэлпер DistributedCacheTagHelper. Распределенное кэширование (Distributed Cache) удобно использовать в том случае, если нужен общий кэш для нескольких машин. Распределенный кэш хранится в какой-либо внешней службе и, если один сервер сохранил элемент кэша, то другие серверы могут его использовать. Например,для распределенного кэша может использоваться такой сервис, как Redis или SQL Server.

Tag-хэлпер DistributedCacheTagHelper

Для этого tag-хэлпера применимы точно такие же атрибуты, как и для рассмотренного ранее хэлпера CacheTagHelper поэтому, не вижу смысла повторяться. Вместо этого мы рассмотрим подробнее настройку распределенного кэширования — с момента установки необходимых nuget-пакетов и, заканчивая просмотром кэшируемых элементов.

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

В качестве примера, рассмотрим подключение и настройку распределенного кэширование в ASP.NET Core MVC с использованием SQL Server

Вариант настройки распределенного кэширования в «чистом» ASP.NET Core с использованием Redis в Windows можно посмотреть здесь. Материалы этой статьи можно будет легко применить к настройке кэширования с Redis и в ASP.NET Core MVC

Установка инструмента dotnet sql-cache

Инструмент sql-cache позволяет создавать таблицы SQL Server для хранения кэшированных данных. По умолчанию, такой инструмент может отсутствовать в Visual Studio, поэтому нелишним будет проверить его установку. В PowerShall для разработчика выполняем следующую команду:

dotnet tool install --global dotnet-sql-cache

в результате вы увидите одно из следующих сообщений:

Вы можете вызвать это средство с помощью следующей команды: dotnet-sql-cache Средство «dotnet-sql-cache» (версии «8.0.0») успешно установлено.

Что означает, что средство не было установлено, но теперь вы можете его использовать. Или же:

Инструмент «dotnet-sql-cache» уже установлен.

Переходим к следующему шагу — настройке SQL Server.

Настройка SQL Server

Создадим новое приложение ASP.NET Core MVC и выберем в меню Visual Studio «Вид»—«Обозреватель объектов SQL Server»:

В появившемся окне вызовем контекстное меню для элемента SQL Server и выберем пункт «Добавить SQL Server»

В новом окне выбираем локальный сервер, остальные настройки можно оставить по умолчанию и жмем «Подключиться»:

Теперь в Обозревателе объектов SQL Server выбираем наше новое подключение и из окна свойств копируем строку подключения, которая будет иметь следующий вид:

Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;Connect Timeout=30;Encrypt=True;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False

Возвращаемся в PowerShell для разработчика и выполняем следующую команду:

dotnet sql-cache create "[ваша_строка_подключения]" dbo TestCache

например, в моем случае, я выполнил такую команду:

dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;Connect Timeout=30;Encrypt=True;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False" dbo TestCache

в результате будет создана таблица c названием TestCache для хранения кэша.

Установка необходимых nuget-пакетов

Теперь нам необходимо установить необходимые nuget-пакеты для работы с распределенным кэшем SQL Server. Здесь нам потребуется установить пакет Microsoft.Extensions.Caching.SqlServer

Настройка проекта ASP.NET Core MVC для работы с распределенным кэшем

Для того, чтобы наш проект мог использовать распределенный кэш SQL Server, необходимо подключить соответствующий сервис. Откроем файл Program.cs и добавим в него следующий код:

// Add services to the container.
builder.Services.AddControllersWithViews(); //<---добавляем после этой строки
builder.Services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = "Data Source=(localdb)\\MSSQLLocalDB;Integrated Security=True;Connect Timeout=30;Encrypt=True;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False";
    options.SchemaName = "dbo";
    options.TableName = "TestCache";
});

Здесь мы подключаем сервис распределенного кэширования и передаем ему в качестве настроек строку подключения, имя схемы и таблицы для хранения кэша. Стоит отметить, что, обычно, строки подключения хранятся в конфигурации проекта, но, для примера в коде выше строка подключения передается как есть в настройки сервиса.

Теперь у нас всё готово, чтобы задействовать распределенное кэширование на основании SQL Server в приложении ASP.NET Core MVC.

Тестирование распределенного кэширования в ASP.NET Core MVC

Не будем оригинальными и воспользуемся примером из предыдущей части, заменив только тэг кэширования на <distributed-cache> следующим образом:

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

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

Запустим приложение и убедимся, что первая строка времени извлекается из кэша:

Теперь убедимся, что мы действительно правильно настроили распределенный кэш и данные попадают к нам не из памяти, а именно из базы данных SQL Server. Для этого можно закрыть приложение, перейти в Обозреватель объектов SQL Server и посмотреть данные в таблице:

Таблица должна сейчас содержать всего одну запись следующего вида:

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

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

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

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

Итого

Tag-хэлпер DistributedCacheTagHelper в ASP.NET Core MVC представлен тэгом <distributed-cache> и позволяет использовать в приложение распределенное кэширование. При использовании этого тэга мы должны каждому элементу кэша присваивать свое уникальное имя, используя атрибут name. В качестве примера рассмотрели использование в качестве распределенного кэша SQL Server.

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