0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Кэширование позволяет сохранять данные для последующего быстрого доступа к ним в случае необходимости. Использование возможностей кэширования способно увеличить производительность приложения, написанного на ASP.NET, так как число обращений к источникам данных (к тем же БД) существенно уменьшается. Наибольшую эффективность кэширование демонстрирует, когда на web-странице есть некоторые элементы, данные которых меняются редко либо меняются через какой-нибудь промежуток времени.</p>
1
<p>Кэширование позволяет сохранять данные для последующего быстрого доступа к ним в случае необходимости. Использование возможностей кэширования способно увеличить производительность приложения, написанного на ASP.NET, так как число обращений к источникам данных (к тем же БД) существенно уменьшается. Наибольшую эффективность кэширование демонстрирует, когда на web-странице есть некоторые элементы, данные которых меняются редко либо меняются через какой-нибудь промежуток времени.</p>
2
<p>Наиболее простой способ кэширования в ASP.NET Core -- это использование объекта<strong>Microsoft.Extensions.Caching.Memory.IMemoryCache</strong>-- он предоставляет возможность сохранять данные в кэше на сервере.</p>
2
<p>Наиболее простой способ кэширования в ASP.NET Core -- это использование объекта<strong>Microsoft.Extensions.Caching.Memory.IMemoryCache</strong>-- он предоставляет возможность сохранять данные в кэше на сервере.</p>
3
<p>Рассматривать механизм кэширования лучше всего на простом примере. Давайте представим, что необходимо кэшировать профиль пользователя либо информацию о пользователе, которая может долго не меняться. Для начала следует создать проект ASP.NET Core по типу Web Application (Model-View-Controller). Назовем его<strong>CachingMVC</strong>. Взаимодействие с БД будет происходить через<strong>Entity Framework</strong>.</p>
3
<p>Рассматривать механизм кэширования лучше всего на простом примере. Давайте представим, что необходимо кэшировать профиль пользователя либо информацию о пользователе, которая может долго не меняться. Для начала следует создать проект ASP.NET Core по типу Web Application (Model-View-Controller). Назовем его<strong>CachingMVC</strong>. Взаимодействие с БД будет происходить через<strong>Entity Framework</strong>.</p>
4
<p>Сначала следует добавить в проект в папку Models класс User, который нужен для описания используемых данных:</p>
4
<p>Сначала следует добавить в проект в папку Models класс User, который нужен для описания используемых данных:</p>
5
<p>Чтобы обеспечить взаимодействие с MS SQL Server через Entity Framework надо добавить в проект через Nuget специальный пакет<strong>Microsoft.EntityFrameworkCore.SqlServer</strong>. А потом добавить в папку Models класс контекста данных под названием<strong>ApplicationContext</strong>:</p>
5
<p>Чтобы обеспечить взаимодействие с MS SQL Server через Entity Framework надо добавить в проект через Nuget специальный пакет<strong>Microsoft.EntityFrameworkCore.SqlServer</strong>. А потом добавить в папку Models класс контекста данных под названием<strong>ApplicationContext</strong>:</p>
6
<p>Для обеспечения взаимодействия с контекстом и базой данных надо создать специальный сервис. Тут сначала добавляем в проект папку Services, а непосредственно в ней определяем новый класс<strong>UserService</strong>:</p>
6
<p>Для обеспечения взаимодействия с контекстом и базой данных надо создать специальный сервис. Тут сначала добавляем в проект папку Services, а непосредственно в ней определяем новый класс<strong>UserService</strong>:</p>
7
<p>Через встроенный механизм по внедрению зависимостей этот сервис станет получать контекст данных и использовать его в целях взаимодействия с БД. Вдобавок к этому, класс реализует логику кэширования.</p>
7
<p>Через встроенный механизм по внедрению зависимостей этот сервис станет получать контекст данных и использовать его в целях взаимодействия с БД. Вдобавок к этому, класс реализует логику кэширования.</p>
8
<p>Кроме того, через механизм внедрения зависимостей в конструкторе у нас есть возможность получить объект кэша<strong>IMemoryCache</strong>. Используя методы интерфейса<strong>IMemoryCache</strong>, появляется возможность этим кэшем управлять:</p>
8
<p>Кроме того, через механизм внедрения зависимостей в конструкторе у нас есть возможность получить объект кэша<strong>IMemoryCache</strong>. Используя методы интерфейса<strong>IMemoryCache</strong>, появляется возможность этим кэшем управлять:</p>
9
<ul><li><strong>bool TryGetValue(object key, out object value)</strong>: для получения элемента по ключу key. Если успех, то параметр value заполнится полученным элементом, а метод вернет true;</li>
9
<ul><li><strong>bool TryGetValue(object key, out object value)</strong>: для получения элемента по ключу key. Если успех, то параметр value заполнится полученным элементом, а метод вернет true;</li>
10
<li><strong>object Get(object key)</strong>: это дополнительный метод расширения. Получает по ключу key элемент, возвращая его;</li>
10
<li><strong>object Get(object key)</strong>: это дополнительный метод расширения. Получает по ключу key элемент, возвращая его;</li>
11
<li><strong>void Remove(object key)</strong>: для удаления из кэша элемента по ключу key;</li>
11
<li><strong>void Remove(object key)</strong>: для удаления из кэша элемента по ключу key;</li>
12
<li><strong>object Set(object key, object value, MemoryCacheEntryOptions options)</strong>: для добавления в кэш элемента с ключом key и значением value. Применяются опции кэширования<strong>MemoryCacheEntryOptions</strong></li>
12
<li><strong>object Set(object key, object value, MemoryCacheEntryOptions options)</strong>: для добавления в кэш элемента с ключом key и значением value. Применяются опции кэширования<strong>MemoryCacheEntryOptions</strong></li>
13
</ul><p>Если говорить по сути, то встроенная реализация интерфейса<strong>IMemoryCache</strong>представляет собой класс<strong>MemoryCache</strong>, используемый по дефолту -- он инкапсулирует все объекты кэша в качестве словаря Dictionary.</p>
13
</ul><p>Если говорить по сути, то встроенная реализация интерфейса<strong>IMemoryCache</strong>представляет собой класс<strong>MemoryCache</strong>, используемый по дефолту -- он инкапсулирует все объекты кэша в качестве словаря Dictionary.</p>
14
<p>У нас кэширование имплементируется в 2-х случаях: в случае получения объекта по id из базы данных и при добавлении этого объекта.</p>
14
<p>У нас кэширование имплементируется в 2-х случаях: в случае получения объекта по id из базы данных и при добавлении этого объекта.</p>
15
<p>Также стоит отметить, что при добавлении объект сначала добавляется в БД, и, если добавление успешно, то также добавляется и в кэш:</p>
15
<p>Также стоит отметить, что при добавлении объект сначала добавляется в БД, и, если добавление успешно, то также добавляется и в кэш:</p>
16
<p>Идем дальше: при сохранении объекта в кэше в виде его ключа выступает не что иное, как значение свойства Id. А посредством параметра<strong>AbsoluteExpirationRelativeToNow</strong>устанавливается время кэширования -- в нашем случае это 5 минут.</p>
16
<p>Идем дальше: при сохранении объекта в кэше в виде его ключа выступает не что иное, как значение свойства Id. А посредством параметра<strong>AbsoluteExpirationRelativeToNow</strong>устанавливается время кэширования -- в нашем случае это 5 минут.</p>
17
<p>При получении объекта по id мы сначала пробуем обнаружить данный объект в кэше, и, если там его нет, он извлекается из БД, а потом добавляется в кэш.</p>
17
<p>При получении объекта по id мы сначала пробуем обнаружить данный объект в кэше, и, если там его нет, он извлекается из БД, а потом добавляется в кэш.</p>
18
<p>Если же ключ в кэше был обнаружен, тогда в объект user будет передано извлекаемое из кэша значение, причем метод TryGetValue() вернет true. Чтобы установить время кэширования, используется альтернативный способ -- метод<strong>SetAbsoluteExpiration</strong>, который тоже устанавливает 5 мин.</p>
18
<p>Если же ключ в кэше был обнаружен, тогда в объект user будет передано извлекаемое из кэша значение, причем метод TryGetValue() вернет true. Чтобы установить время кэширования, используется альтернативный способ -- метод<strong>SetAbsoluteExpiration</strong>, который тоже устанавливает 5 мин.</p>
19
<p>В результате на выходе будет следующая структура проекта:</p>
19
<p>В результате на выходе будет следующая структура проекта:</p>
20
<p>Далее надо будет зарегистрировать сервисы кэширования и entity framework, а также задействовать компонент middleware в классе Startup:</p>
20
<p>Далее надо будет зарегистрировать сервисы кэширования и entity framework, а также задействовать компонент middleware в классе Startup:</p>
21
<p>Но прежде всего, чтобы добавить возможность кэширования, следует добавить сервис в методе ConfigureServices():</p>
21
<p>Но прежде всего, чтобы добавить возможность кэширования, следует добавить сервис в методе ConfigureServices():</p>
22
<p>То есть можно сказать, что данный сервис устанавливает зависимость для<strong>IMemoryCache</strong>, так как создается объект синглтон:</p>
22
<p>То есть можно сказать, что данный сервис устанавливает зависимость для<strong>IMemoryCache</strong>, так как создается объект синглтон:</p>
23
<p>Теперь в классе контроллера HomeController определяем следующий код:</p>
23
<p>Теперь в классе контроллера HomeController определяем следующий код:</p>
24
<p>По итогу при 1-м обращении к программному приложению данные станут извлекаться из БД и сохраняться в кэш. При дальнейших обращениях в пределах установленного времени кэширования (5 минут) данные станут извлекаться уже из кэша:</p>
24
<p>По итогу при 1-м обращении к программному приложению данные станут извлекаться из БД и сохраняться в кэш. При дальнейших обращениях в пределах установленного времени кэширования (5 минут) данные станут извлекаться уже из кэша:</p>
25
<p>По материалам<a>https://metanit.com/</a>.</p>
25
<p>По материалам<a>https://metanit.com/</a>.</p>
26
26