Как реализовать кэширование в памяти в ASP.NET Core

автор vadim


Шаблоны проектирования были разработаны для решения проблем, которые часто встречаются в программных приложениях. Они представляют собой решения повторяющихся проблем и сложностей при разработке программного обеспечения. Шаблоны проектирования делятся на три отдельные категории: творческие, структурные и поведенческие.

Шаблоны творческого проектирования используются для абстрагирования и упрощения создания объектов. Структурные шаблоны используются для определения отношений между объектами (например, наследование и композиция). А поведенческие шаблоны проектирования используются для управления способами взаимодействия объектов друг с другом (например, сотрудничество и делегирование).

Шаблон дизайна декоратора — это структурный шаблон, который можно использовать для динамического или статического придания функциональности или поведения объекту без изменения структуры объекта. В этой статье мы будем использовать шаблон декоратора для реализации кэша в памяти в приложении ASP.NET Core.

Обратите внимание, что ASP.NET Core не имеет объекта кэша, как его предшественник ASP.NET. Тем не менее, он предлагает различные варианты кэширования, включая кэширование в памяти, распределенное кэширование и кэширование ответов. Мы можем легко реализовать кэширование в приложении ASP.NET Core, используя возможности промежуточного программного обеспечения или сервисов вместе с шаблоном декоратора.

Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте проект веб-API ASP.NET Core в Visual Studio 2022.

Чтобы создать проект веб-API ASP.NET Core 7 в Visual Studio 2022, выполните действия, описанные ниже.

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальные API)». В этом проекте мы не будем использовать минимальные API.
  9. В другом месте окна «Дополнительная информация» оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию) и убедитесь, что флажки «Включить поддержку Open API», «Настроить для HTTPS» и «Включить Docker» остаются снятыми. . Мы не будем здесь использовать ни одну из этих функций.
  10. Нажмите Создать.

Мы будем использовать этот проект веб-API ASP.NET Core для работы с примерами кода в разделах ниже.

Что такое кэшированный репозиторий? Зачем он нам нужен?

Шаблон репозитория — это широко используемый шаблон проектирования, который помогает отделить логику доступа к данным от остальной части приложения. Кэшированный репозиторий используется для повышения эффективности и производительности операций доступа к данным. Он сочетает в себе широко используемый шаблон репозитория с методами кэширования.

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

Как работает кэшированный репозиторий

Вот как обычно работает кэшированный репозиторий:

  1. Кэшированный репозиторий сначала проверяет, хранятся ли в кеше запрошенные клиентом данные.
  2. Если данные не найдены в кеше, кэшированный репозиторий передаст запрос базовому репозиторию. Базовый репозиторий затем получит данные из исходного источника, например базы данных.
  3. После того, как данные извлекаются из источника данных, они сохраняются в кэше.
  4. Наконец, запрошенные данные возвращаются клиенту.

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

Вы можете реализовать кэшированные репозитории, используя различные механизмы кэширования, такие как кэширование в памяти, распределенное кэширование или даже собственные решения для кэширования. Кэшированный репозиторий может значительно повысить производительность вашего приложения за счет сокращения времени доступа к данным, уменьшения задержек и улучшения масштабируемости.

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

Создайте репозиторий кэша в ASP.NET Core.

Прежде чем создавать хранилище кэша, давайте создадим класс модели для нашего приложения. Щелкните правой кнопкой мыши наш проект веб-API в окне обозревателя решений и создайте новый файл .cs. Замените сгенерированный по умолчанию код следующим фрагментом кода, чтобы создать наш класс модели.

    public class Author
    {
        public Guid Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
    }

Затем создайте интерфейс с именем IAuthorRepository, который содержит объявление методов, соответствующих операциям, поддерживаемым нашим классом репозитория. Замените сгенерированный по умолчанию код следующим кодом.

public interface IAuthorRepository
{
   Task<List<Author>> GetAuthorsAsync();
}

Теперь создайте новый класс с именем AuthorRepository в файле с тем же именем и расширением .cs и введите туда следующий код.

public class AuthorRepository: IAuthorRepository
 {
     private readonly List<Author> authorList;
     public AuthorRepository()
     {
         authorList = new List<Author>() {
         new Author()
         {
             Id = Guid.NewGuid(),
             FirstName = "Joydip",
             LastName = "Kanjilal",
             Address = "1 ABC Road",
             City = "Hyderabad",
             Country = "India",
             PostalCode = "500089",
             Phone = "1234567890"
         },
         new Author()
         {
             Id = Guid.NewGuid(),
             FirstName = "Steve",
             LastName = "Barnes",
             Address = "9/2A CT Road",
             City = "Chicago",
             Country = "USA",
             PostalCode = "101010",
             Phone = "0987654321"
         },
         new Author()
         {
             Id = Guid.NewGuid(),
             FirstName = "Michael",
             LastName = "Bogan",
             Address = "81 Red Road",
             City = "Sydney",
             Country = "Australia",
             PostalCode = "123456",
             Phone = "1212121212"
         }
         };
     }
     public async Task<List<Author>> GetAuthorsAsync()
     {
         return await Task.FromResult(authorList);
     }
 }

Создайте класс декоратора с функцией кэширования.

Для реализации функции кэширования мы будем использовать другой интерфейс, называемый ICachedAuthorRepository. Интерфейс ICachedAuthorRepository объявляет только один метод с именем GetCachedAuthorsAsync(), как показано в приведенном ниже фрагменте кода.

public interface ICachedAuthorRepository

{

Task> GetCachedAuthorsAsync();

}

Теперь мы создадим класс декоратора с функцией кэширования. Для этого создайте новый класс под названием AuthorCachingDecorator, реализующий тот же интерфейс ICachedAuthorRepository, и напишите туда следующий код.

    public class AuthorCachingDecorator : ICachedAuthorRepository

{

частный только для чтения IMemoryCache _memoryCache;

частный только для чтения IAuthorRepository _authorRepository;

общедоступный AuthorCachingDecorator (IMemoryCache MemoryCache,

IAuthorRepository авторРепозиторий)

{

_memoryCache = MemoryCache;

_authorRepository = авторRepository;

}

общедоступная асинхронная задача> GetCachedAuthorsAsync()

{

const stringcacheKey = “Автор”;

если (!_memoryCache.TryGetValue(cacheKey,

out List кэшированные данные))

{

кэшированные данные = ждут _authorRepository.GetAuthorsAsync();

_memoryCache.Set(cacheKey, кэшированные данные,

TimeSpan.FromMinutes(10));

}

вернуть кэшированные данные;

}

}

В методах CachedAuthorsAsync данные, полученные впервые, сохраняются в кеше перед их возвратом. Для всех последующих вызовов данные возвращаются из кэша. Данные в кэше сохраняются в течение 10 минут, по истечении которых кэшированные данные становятся недействительными, т. е. данные из кэша удаляются. Кэш будет снова заполнен свежими данными при следующем вызове, и та же процедура продолжится.

Обратите внимание, как внедрение зависимостей используется в классе AuthorCachingDecorator для получения экземпляра типа IAuthorRepository. Этот экземпляр используется для получения данных путем вызова метода GetAuthorsAsync, относящегося к классу AuthorRepository.

в ядре кэша памяти aspnet ИДГ

Рисунок 1. Реализация кэша в памяти в ASP.NET Core.

Если данные уже доступны в кэше, метод GetAuthorsAsync класса AuthorRepository вызываться не будет.

Настройте файл Program.cs

Еще два шага, и мы сможем запустить наше приложение. Мы должны добавить наши службы кэширования памяти в IServiceCollection, используя следующий фрагмент кода в файле Program.cs.

builder.Services.AddMemoryCache();

Нам также следует добавить экземпляры типов IAuthorRepository и ICachedAuthorRepository в IServiceCollection, используя приведенный ниже код.

builder.Services.AddScoped<IAuthorRepository,
AuthorRepository>();
builder.Services.AddScoped<ICachedAuthorRepository,
AuthorCachingDecorator>();

Полный исходный код файла Program.cs приведен ниже для справки.

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddMemoryCache();
builder.Services.AddScoped<IAuthorRepository, AuthorRepository>();
builder.Services.AddScoped<ICachedAuthorRepository, AuthorCachingDecorator>();
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseAuthorization();
app.MapControllers();
app.Run();

Наконец, когда вы запускаете приложение, данные автора должны отображаться в вашем веб-браузере, как показано на рисунке 2.

в кеше памяти в действии ИДГ

Рисунок 2. Наш кэш в памяти в действии.

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

Дальше читайте это:

  • Облачные вычисления больше не являются пустяком
  • Что такое генеративный ИИ? Искусственный интеллект, который создает
  • Программирование с помощью ИИ: советы и лучшие практики от разработчиков
  • Python пытается удалить GIL и повысить параллелизм
  • 7 причин, по которым Java по-прежнему хороша
  • Война за лицензирование открытого исходного кода окончена

Related Posts

Оставить комментарий