Содержание
Помимо обычного кэширования в памяти с использованием 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.
Установка инструмента dotnet sql-cache
Инструмент sql-cache позволяет создавать таблицы SQL Server для хранения кэшированных данных. По умолчанию, такой инструмент может отсутствовать в Visual Studio, поэтому нелишним будет проверить его установку. В PowerShall для разработчика выполняем следующую команду:
dotnet tool install --global 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.







