Содержание
Помимо обычного кэширования в памяти с использованием 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.