Упражнение. Кэширование данных в Redis

Завершено

В этом упражнении вы добавите кэширование в частично завершенное облачное приложение для розничной торговли на открытом воздухе. Вы добавите Redis в проект AppHost , а затем реализуете кэширование выходных данных в проекте WebApp и распределенное кэширование в проекте Catalog.API .

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

Предварительные требования для .NET Aspire:

  • .NET 8
  • Visual Studio 2022 Preview
  • Docker Desktop
  • Рабочая нагрузка .NET Aspire в Visual Studio

Если вы уже установили эти пакеты, вы можете пропустить работу с кэшем Redis.

Установка .NET 8

Следуйте этой ссылке .NET 8 и выберите правильный установщик операционной системы. Например, если вы используете Windows 11 и современный процессор, выберите пакет SDK x64 .NET 8 для Windows.

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

dotnet --version

Вы увидите номер версии установленного пакета SDK для .NET. Например:

8.0.300-preview.24203.14

Установка Предварительной версии Visual Studio 2022

Перейдите по этой ссылке предварительной версии Visual Studio 2022 и выберите "Скачать предварительную версию". После завершения скачивания запустите установщик и следуйте инструкциям.

Установка Docker Desktop

Следуйте этой ссылке Docker Desktop и выберите правильный установщик операционной системы. После завершения скачивания запустите установщик и следуйте инструкциям. Для обеспечения оптимальной производительности и совместимости используйте серверную часть WSL 2.

Откройте классическое приложение Docker и примите соглашение об обслуживании.

Установка рабочей нагрузки .NET Aspire в Visual Studio

Установите рабочую нагрузку .NET Aspire с помощью .NET CLI:

  1. Откройте окно терминала.

  2. Обновите рабочие нагрузки .NET с помощью следующей команды:

    dotnet workload update
    

    Должно появиться сообщение об успешном обновлении рабочих нагрузок.

    No workloads installed for this feature band. To update workloads installed with earlier SDK versions, include the --from-previous-sdk option.
    Updated advertising manifest microsoft.net.sdk.ios.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.net6.
    Updated advertising manifest microsoft.net.sdk.android.
    Updated advertising manifest microsoft.net.workload.emscripten.net7.
    Updated advertising manifest microsoft.net.workload.emscripten.net6.
    Updated advertising manifest microsoft.net.sdk.macos.
    Updated advertising manifest microsoft.net.workload.emscripten.current.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.current.
    Updated advertising manifest microsoft.net.sdk.maui.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.net7.
    Updated advertising manifest microsoft.net.sdk.maccatalyst.
    Updated advertising manifest microsoft.net.sdk.tvos.
    Updated advertising manifest microsoft.net.sdk.aspire.
    No workloads installed for this feature band. To update workloads installed with earlier SDK versions, include the --from-previous-sdk option.
    
    Successfully updated workload(s): .
    
  3. Установите рабочую нагрузку .NET Aspire с помощью следующей команды:

    dotnet workload install aspire
    

    Должно появиться сообщение о том, что установленная рабочая нагрузка Aspire.

    Installing Aspire.Hosting.Sdk.Msi.x64 ...... Done
    Installing Aspire.ProjectTemplates.Msi.x64 ..... Done
    Installing Aspire.Hosting.Orchestration.win-x64.Msi.x64 ............. Done
    Installing Aspire.Hosting.Msi.x64 ..... Done
    Installing Aspire.Dashboard.Sdk.win-x64.Msi.x64 ....... Done
    
    Successfully installed workload(s) aspire.
    
  4. Убедитесь, что рабочая нагрузка .NET Aspire установлена с помощью этой команды:

    dotnet workload list
    

    Вы увидите сведения о рабочей нагрузке aspire .

    Installed Workload Id      Manifest Version      Installation Source
    ---------------------------------------------------------------------------------------------
    aspire                     8.0.0/8.0.100         SDK 8.0.300-preview.24203, VS 17.10.34902.84
    
    Use `dotnet workload search` to find additional workloads to install.
    

Клонирование и изменение примера приложения

Давайте используем git для получения примера приложения, созданного с помощью .NET Aspire. Приложение еще не настроит кэширование:

  1. В командной строке перейдите в папку, в которой можно работать с кодом.

  2. Выполните следующую команду, чтобы клонировать пример приложения eShop в Северной горах:

    git clone -b aspire-cache https://github.com/MicrosoftDocs/mslearn-aspire-starter
    
  3. Запустите Visual Studio и выберите " Открыть проект или решение".

  4. Перейдите к папке, в которой клонировали eShop, откройте начальную папку и выберите файл eShop.rediscache.sln , а затем нажмите кнопку "Открыть".

  5. В Обозреватель решений перейдите к WebApp/Components/Pages и дважды щелкните Catalog.razor.

  6. Найдите следующую строку кода:

    <SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment.</SectionContent>
    
  7. Замените эту строку следующим кодом:

    <SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment. It's @DateTime.Now</SectionContent>
    
  8. Чтобы запустить приложение, нажмите клавишу F5 или выберите "Начать отладку>".

  9. Если появится диалоговое окно "Пуск Docker Desktop" , нажмите кнопку "Да".

  10. Когда появится панель мониторинга eShop .NET Aspire, для ресурса веб-приложения выберите одну из конечных точек:

    Снимок экрана: начало веб-приложения на панели мониторинга .NET Aspire.

  11. Конечная точка отображает домашнюю страницу Северных гор. Включая время на сервере:

    Снимок экрана: домашняя страница

  12. Нажмите клавишу F5 , чтобы обновить страницу. Так как страница не кэшируется, время отображения изменений при каждом обновлении страницы, если вторая изменилась.

  13. Перейдите на вкладку браузера, на которой отображается панель мониторинга .NET Aspire, а затем в области навигации слева выберите "Трассировки".

  14. Трассировки с именем веб-приложения: GET/ — запросы на домашнюю страницу. Запишите типичную длительность этих запросов, а затем для одного из них выберите "Вид " в столбце "Сведения ".

    Снимок экрана: панель мониторинга .NET Aspire с трассировками запросов на домашнюю страницу Северной горы без кэширования.

  15. В представлении временной шкалы обратите внимание, что веб-приложение вызывает несколько микрослужб для создания ответа.

  16. Закройте домашнюю страницу Северных гор и панель мониторинга .NET Aspire.

  17. Чтобы остановить отладку, нажмите клавиши SHIFT — F5 или выберите "Отладочная > остановка отладки".

Добавление службы кэширования резервной копии

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

  1. В Visual Studio в Обозреватель решений щелкните правой кнопкой мыши проект eShop.AppHost, выберите "Добавить", а затем выберите пакет .NET Aspire.

  2. В текстовом поле поиска в конце существующего текста введите Redis.

  3. Выберите пакет Aspire.Hosting.Redis .

  4. В списке версий выберите последнюю версию 8.0.0 и нажмите кнопку "Установить".

  5. Если появится диалоговое окно "Предварительные изменения" , нажмите кнопку "Применить".

  6. В диалоговом окне "Принятие лицензии" нажмите кнопку "Принять".

  7. В Обозреватель решений разверните проект AppHost и дважды щелкните Program.cs.

  8. Найдите следующие строки кода:

    // Databases
    
    var postgres = builder.AddPostgres("postgres").WithPgAdmin();
    var catalogDb = postgres.AddDatabase("CatalogDB");
    
  9. Сразу после этих строк добавьте следующий код:

    // Cache
    var redis = builder.AddRedis("cache");
    
  10. Найдите следующую строку кода, которая добавляет проект API каталога в оркестрацию .NET Aspire:

    var catalogApi = builder.AddProject<Catalog_API>("catalog-api")
        .WithReference(catalogDb);
    
  11. Чтобы передать кэш Redis в проект API каталога, замените этот код следующими строками:

    var catalogApi = builder.AddProject<Catalog_API>("catalog-api")
        .WithReference(catalogDb)
        .WithReference(redis);
    

    Примечание.

    Мы будем использовать кэш в API каталога для выполнения распределенного кэширования.

  12. Найдите следующую строку кода, которая добавляет проект WebApp в оркестрацию .NET Aspire:

    builder.AddProject<WebApp>("webapp")
        .WithReference(catalogApi);
    
  13. Чтобы передать кэш Redis в проект WebApp, замените этот код следующими строками:

    builder.AddProject<WebApp>("webapp")
        .WithReference(catalogApi)
        .WithReference(redis);
    

    Примечание.

    Для кэширования выходных данных мы будем использовать кэш в WebApp.

  14. Чтобы сохранить файл Program.cs , нажмите клавиши CTRL - S или выберите "Сохранить файл > " Program.cs.

Использование кэширования выходных данных в проекте WebApp

Теперь давайте будем использовать кэш Redis в проекте WebApp для кэширования выходных данных домашней страницы:

  1. В Visual Studio в Обозреватель решений щелкните правой кнопкой мыши проект WebApp, выберите "Добавить" и выберите пакет .NET Aspire.

  2. В текстовом поле поиска в конце существующего текста введите Redis.

  3. Выберите пакет Aspire.StackExchange.Redis.OutputCaching .

  4. В списке версий выберите последнюю версию 8.0.0 и нажмите кнопку "Установить".

  5. Если появится диалоговое окно "Предварительные изменения" , нажмите кнопку "Применить".

  6. В диалоговом окне "Принятие лицензии" нажмите кнопку "Принять".

  7. После завершения установки в Обозреватель решений разверните WebApp и дважды щелкните Program.cs.

  8. Найдите следующую строку кода:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Сразу после этой строки добавьте в проект кэш выходных данных:

    builder.AddRedisOutputCache("cache");
    
  10. Найдите следующую строку кода:

    var app = builder.Build();
    
  11. Сразу после этой строки добавьте ПО промежуточного слоя кэширования в конвейер запросов, добавьте следующий код:

    app.UseOutputCache();
    
  12. В Обозреватель решений разверните страницы > компонентов WebApp > и дважды щелкните Catalog.razor.

  13. Найдите следующую строку кода:

    @attribute [StreamRendering]
    
  14. Сразу после этой строки добавьте следующий код:

    @attribute [Microsoft.AspNetCore.OutputCaching.OutputCache(Duration = 10)]
    

Кэширование выходных данных теста

Кэширование выходных данных теперь реализовано на домашней странице Северной горы. Давайте протестируем его:

  1. Чтобы запустить приложение, нажмите клавишу F5 или выберите "Отладка > начать отладку".

  2. Когда появится панель мониторинга eShop .NET Aspire, для ресурса веб-приложения выберите одну из конечных точек:

    Снимок экрана: начало веб-приложения на панели мониторинга .NET Aspire.

  3. Конечная точка отображает домашнюю страницу Северной горы, включая время на сервере.

  4. Нажмите клавишу F5 , чтобы обновить страницу. Так как страница кэшируется в течение 10 секунд, время отображается только в том случае, если после кэшированного запроса оно превышает 10 секунд.

  5. Перейдите на вкладку браузера, на которой отображается панель мониторинга .NET Aspire, а затем в области навигации слева выберите "Трассировки".

  6. Трассировки с именем веб-приложения: GET/ — запросы на домашнюю страницу. Некоторые запросы на домашнюю страницу, которые не могут быть удовлетворены из кэша, имеют аналогичные сроки, которые вы указали ранее. Однако другие запросы, возвращаемые из кэша, имеют значительно более короткие сроки.

  7. Для одного из более коротких запросов выберите "Вид " в столбце "Сведения ". Обратите внимание, что запрос был получен из кэша Redis:

    Снимок экрана: панель мониторинга .NET Aspire с трассировкой кэшированного запроса.

  8. Закройте домашнюю страницу Северных гор и панель мониторинга .NET Aspire.

  9. Чтобы остановить отладку, нажмите клавиши SHIFT — F5 или выберите "Отладочная > остановка отладки".

Использование распределенного кэширования

Мы также можем использовать Redis для выполнения распределенного кэширования в проекте Catalog.API :

  1. В Visual Studio в Обозреватель решений щелкните правой кнопкой мыши проект Catalog.API, выберите "Добавить" и выберите пакет .NET Aspire.

  2. В текстовом поле поиска в конце существующего текста введите Redis.

  3. Выберите пакет Aspire.StackExchange.Redis.DistributedCaching .

  4. В списке версий выберите последнюю версию 8.0.0 и нажмите кнопку "Установить".

  5. Если появится диалоговое окно "Предварительные изменения" , нажмите кнопку "Применить".

  6. В диалоговом окне "Принятие лицензии" нажмите кнопку "Принять".

  7. После завершения установки в Обозреватель решений разверните catalog.API и дважды щелкните Program.cs.

  8. Найдите следующую строку кода:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Сразу после этой строки добавьте в проект кэш выходных данных:

    builder.AddRedisDistributedCache("cache");
    
  10. В Обозреватель решений разверните API Catalog.API > и дважды щелкните CatalogApi.cs.

  11. Найдите следующий код, который объявляет GetAllItems метод:

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services)
    {
    
  12. Чтобы получить кэш Redis с помощью внедрения зависимостей, измените этот код, чтобы добавить новый параметр в метод:

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services,
        IDistributedCache cache)
    {
    
  13. Удалите все содержимое GetAllItems метода и замените его следующим кодом:

    var pageSize = paginationRequest.PageSize;
    var pageIndex = paginationRequest.PageIndex;
    
    var totalItems = await services.DbContext.CatalogItems
        .LongCountAsync();
    
    // Check that there are cached items
    var cachedItems = await cache.GetAsync("catalogItems");
    
    if (cachedItems is null)
    {
        // There are no items in the cache. Get them from the database
        var itemsOnPage = await services.DbContext.CatalogItems
            .OrderBy(c => c.Name)
            .Skip(pageSize * pageIndex)
            .Take(pageSize)
            .AsNoTracking()
            .ToListAsync();
    
        // Store the items in the cache for 10 seconds
        await cache.SetAsync("catalogItems", Encoding.UTF8.GetBytes(System.Text.Json.JsonSerializer.Serialize(itemsOnPage)), new()
        {
            AbsoluteExpiration = DateTime.Now.AddSeconds(10)
        });
    
        ChangeUriPlaceholder(services.Options.Value, itemsOnPage);
        return TypedResults.Ok(new PaginatedItems<CatalogItem>(pageIndex, pageSize, totalItems, itemsOnPage));
    
    }
    else
    {
        // There are items in the cache. Deserialize them to display.
        var itemsOnPage = System.Text.Json.JsonSerializer.Deserialize<List<CatalogItem>>(cachedItems);
        // Make sure itemsOnPage is not null
        if (itemsOnPage is null)
        {
            itemsOnPage = new List<CatalogItem>();
        }
    
        ChangeUriPlaceholder(services.Options.Value, itemsOnPage);
        return TypedResults.Ok(new PaginatedItems<CatalogItem>(pageIndex, pageSize, totalItems, itemsOnPage));
    }
    

Тестирование распределенного кэширования

Распределенное кэширование теперь реализовано в проекте Catalog.API . Давайте протестируем его:

  1. Чтобы запустить приложение, нажмите клавишу F5 или выберите "Отладка > начать отладку".

  2. Когда появится панель мониторинга eShop .NET Aspire, для ресурса api каталога выберите конечную точку:

    Снимок экрана: запуск API каталога на панели мониторинга .NET Aspire.

  3. Конечная точка отображает интерфейс Swagger для микрослужбы API каталога. Рядом с методом /api/v1/catalog/items выберите GET.

  4. Выберите " Попробовать", а затем нажмите кнопку "Выполнить". Результаты отображаются в окне текста ответа:

    Снимок экрана: результаты каталога, отображаемые в пользовательском интерфейсе Swagger.

  5. Нажмите кнопку "Выполнить несколько раз", чтобы снова вызвать API. Эти запросы должны получать элементы из кэша, если запрос меньше 10 секунд после первого.

  6. Перейдите на вкладку браузера, на которой отображается панель мониторинга .NET Aspire, а затем в области навигации слева выберите "Трассировки".

  7. Трассировки с помощью api каталога имен : GET /api/v1/catalog/items — запросы к методу элементов API каталога. Обратите внимание, что первый запрос к такому методу занимает больше времени, чтобы сформулировать следующие запросы, которые API получает элементы из кэша Redis:

    Снимок экрана: страница трассировки панели мониторинга .NET Aspire с кэшируемыми запросами к API каталога.

  8. Закройте страницу Swagger и панель мониторинга .NET Aspire.

  9. Чтобы остановить отладку, нажмите клавиши SHIFT — F5 или выберите "Отладочная > остановка отладки".