Ćwiczenie — buforowanie danych w usłudze Redis

Ukończone

W tym ćwiczeniu dodasz buforowanie do częściowo ukończonej aplikacji natywnej dla chmury dla sprzedawcy sprzętu zewnętrznego. Dodasz usługę Redis do projektu AppHost , a następnie zaimplementujesz buforowanie danych wyjściowych w projekcie aplikacji internetowej i buforowanie rozproszone w projekcie Catalog.API .

Instalacja wymagań wstępnych

Wymagania wstępne dotyczące platformy .NET Aspire są następujące:

  • .NET 8
  • Visual Studio 2022 (wersja zapoznawcza)
  • Docker Desktop
  • Obciążenie .NET Aspire w programie Visual Studio

Jeśli masz już zainstalowane te pakiety, możesz przejść od razu, aby rozpocząć pracę z pamięcią podręczną Redis.

Instalowanie platformy .NET 8

Postępuj zgodnie z tym linkiem platformy .NET 8 i wybierz prawidłowy instalator dla swojego systemu operacyjnego. Jeśli na przykład używasz systemu Windows 11 i nowoczesnego procesora, wybierz zestaw SDK platformy .NET 8 x64 dla systemu Windows.

Po zakończeniu pobierania uruchom instalatora i postępuj zgodnie z instrukcjami. W oknie terminalu uruchom następujące polecenie, aby sprawdzić, czy instalacja zakończyła się pomyślnie:

dotnet --version

Powinien zostać wyświetlony numer wersji zainstalowanego zestawu .NET SDK. Na przykład:

8.0.300-preview.24203.14

Instalowanie programu Visual Studio 2022 (wersja zapoznawcza)

Postępuj zgodnie z tym linkiem programu Visual Studio 2022 (wersja zapoznawcza) i wybierz pozycję Pobierz wersję zapoznawcza. Po zakończeniu pobierania uruchom instalatora i postępuj zgodnie z instrukcjami.

Instalowanie programu Docker Desktop

Postępuj zgodnie z tym linkiem do programu Docker Desktop i wybierz prawidłowy instalator dla swojego systemu operacyjnego. Po zakończeniu pobierania uruchom instalatora i postępuj zgodnie z instrukcjami. Aby uzyskać najlepszą wydajność i zgodność, użyj zaplecza WSL 2.

Otwórz aplikację docker Desktop i zaakceptuj umowę serwisową.

Instalowanie obciążenia platformy .NET Aspire w programie Visual Studio

Zainstaluj obciążenie platformy .NET Aspire przy użyciu interfejsu wiersza polecenia platformy .NET:

  1. Otwórz terminal.

  2. Zaktualizuj obciążenia platformy .NET za pomocą tego polecenia:

    dotnet workload update
    

    Powinien zostać wyświetlony komunikat informujący o pomyślnym zaktualizowaniu obciążeń.

    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. Zainstaluj obciążenie platformy .NET Aspire za pomocą tego polecenia:

    dotnet workload install aspire
    

    Powinien zostać wyświetlony komunikat informujący o zainstalowaniu obciążenia 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. Sprawdź, czy obciążenie platformy .NET Aspire jest zainstalowane za pomocą tego polecenia:

    dotnet workload list
    

    Powinny zostać wyświetlone szczegóły aspire obciążenia.

    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.
    

Klonowanie i modyfikowanie przykładowej aplikacji

Użyjmy metody , aby uzyskać przykładową aplikację utworzoną za pomocą git platformy .NET Aspire. Aplikacja nie ma jeszcze skonfigurowanego buforowania:

  1. W wierszu polecenia przejdź do wybranego folderu, w którym możesz pracować z kodem.

  2. Wykonaj następujące polecenie, aby sklonować przykładową aplikację eShop w Górach Północnych:

    git clone -b aspire-cache https://github.com/MicrosoftDocs/mslearn-aspire-starter
    
  3. Uruchom program Visual Studio, a następnie wybierz pozycję Otwórz projekt lub rozwiązanie.

  4. Przejdź do folderu, w którym sklonujesz eShop, otwórz folder Start i wybierz plik eShop.rediscache.sln , a następnie wybierz pozycję Otwórz.

  5. W Eksplorator rozwiązań przejdź do pozycji WebApp/Components/Pages, a następnie kliknij dwukrotnie plik Catalog.razor.

  6. Znajdź następujący wiersz kodu:

    <SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment.</SectionContent>
    
  7. Zastąp wiersz następującym kodem:

    <SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment. It's @DateTime.Now</SectionContent>
    
  8. Aby uruchomić aplikację, naciśnij F5 lub wybierz pozycję Debuguj>rozpocznij debugowanie.

  9. Jeśli zostanie wyświetlone okno dialogowe Uruchamianie programu Docker Desktop, wybierz pozycję Tak.

  10. Po wyświetleniu pulpitu nawigacyjnego eShop .NET Aspire dla zasobu aplikacji internetowej wybierz jeden z punktów końcowych:

    Zrzut ekranu przedstawiający miejsce uruchamiania aplikacji internetowej na pulpicie nawigacyjnym platformy .NET Aspire.

  11. W punkcie końcowym zostanie wyświetlona strona główna Gór Północnych. Uwzględnianie czasu na serwerze:

    Zrzut ekranu przedstawiający stronę główną Góry Północne z wyświetlonym czasem po stronie serwera.

  12. Naciśnij F5 , aby odświeżyć stronę. Ponieważ strona nie jest buforowana, czas wyświetlania zmienia się za każdym razem, gdy ją odświeżasz, o ile druga uległa zmianie.

  13. Przejdź do karty przeglądarki, na której jest wyświetlany pulpit nawigacyjny platformy .NET Aspire, a następnie w obszarze nawigacji po lewej stronie wybierz pozycję Ślady.

  14. Ślady z nazwą aplikacji internetowej: GET / są żądaniami dla strony głównej. Zanotuj typowy czas trwania tych żądań, a następnie dla jednego z nich wybierz pozycję Wyświetl w kolumnie Szczegóły :

    Zrzut ekranu przedstawiający pulpit nawigacyjny platformy .NET Aspire przedstawiający ślady żądań do strony głównej Northern Mountain bez buforowania.

  15. W widoku osi czasu zwróć uwagę, że aplikacja internetowa wywołuje wiele mikrousług w celu skonstruowania odpowiedzi.

  16. Zamknij stronę główną Góry Północne i pulpit nawigacyjny platformy .NET Aspire.

  17. W programie Visual Studio, aby zatrzymać debugowanie, naciśnij SHIFT — F5 lub wybierz pozycję Debuguj zatrzymaj > debugowanie.

Dodawanie usługi buforowania kopii zapasowej

Teraz, gdy już wiesz, jak strona główna działa bez buforowania, dodajmy buforowanie danych wyjściowych, aby sprawdzić, czy poprawia czas odpowiedzi. Zacznij od dodania składnika buforowania danych wyjściowych do projektu AppHost :

  1. W programie Visual Studio w Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt eShop.AppHost, wybierz pozycję Dodaj, a następnie wybierz pakiet .NET Aspire.

  2. W polu tekstowym wyszukiwania na końcu istniejącego tekstu wpisz Redis.

  3. Wybierz pakiet Aspire.Hosting.Redis .

  4. Na liście Wersja wybierz najnowszą wersję 8.0.0, a następnie wybierz pozycję Zainstaluj.

  5. Jeśli zostanie wyświetlone okno dialogowe Podgląd zmian, wybierz pozycję Zastosuj.

  6. W oknie dialogowym Akceptacja licencji wybierz pozycję Akceptuję.

  7. W Eksplorator rozwiązań rozwiń projekt AppHost, a następnie kliknij dwukrotnie Program.cs.

  8. Znajdź następujące wiersze kodu:

    // Databases
    
    var postgres = builder.AddPostgres("postgres").WithPgAdmin();
    var catalogDb = postgres.AddDatabase("CatalogDB");
    
  9. Bezpośrednio po tych wierszach dodaj następujący kod:

    // Cache
    var redis = builder.AddRedis("cache");
    
  10. Znajdź następujący wiersz kodu, który dodaje projekt interfejsu API wykazu do orkiestracji platformy .NET Aspire:

    var catalogApi = builder.AddProject<Catalog_API>("catalog-api")
        .WithReference(catalogDb);
    
  11. Aby przekazać pamięć podręczną Redis Cache do projektu interfejsu API wykazu, zastąp ten kod następującymi wierszami:

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

    Uwaga

    Do wykonywania buforowania rozproszonego użyjemy pamięci podręcznej w interfejsie API wykazu.

  12. Znajdź następujący wiersz kodu, który dodaje projekt WebApp do orkiestracji platformy .NET Aspire:

    builder.AddProject<WebApp>("webapp")
        .WithReference(catalogApi);
    
  13. Aby przekazać pamięć podręczną Redis Cache do projektu aplikacji internetowej, zastąp ten kod następującymi wierszami:

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

    Uwaga

    Użyjemy pamięci podręcznej w aplikacji internetowej, aby wykonać buforowanie danych wyjściowych.

  14. Aby zapisać plik Program.cs , naciśnij CTRL — S lub wybierz pozycję Zapisz > plik Program.cs.

Używanie buforowania danych wyjściowych w projekcie aplikacji internetowej

Teraz użyjemy pamięci podręcznej Redis Cache w projekcie aplikacji internetowej, aby buforować dane wyjściowe strony głównej:

  1. W programie Visual Studio w Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt WebApp, wybierz pozycję Dodaj, a następnie wybierz pakiet .NET Aspire.

  2. W polu tekstowym wyszukiwania na końcu istniejącego tekstu wpisz Redis.

  3. Wybierz pakiet Aspire.StackExchange.Redis.OutputCaching .

  4. Na liście Wersja wybierz najnowszą wersję 8.0.0, a następnie wybierz pozycję Zainstaluj.

  5. Jeśli zostanie wyświetlone okno dialogowe Podgląd zmian, wybierz pozycję Zastosuj.

  6. W oknie dialogowym Akceptacja licencji wybierz pozycję Akceptuję.

  7. Po zakończeniu instalacji w Eksplorator rozwiązań rozwiń węzeł Aplikacja internetowa, a następnie kliknij dwukrotnie Program.cs.

  8. Znajdź następujący wiersz kodu:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Bezpośrednio po tym wierszu, aby dodać pamięć podręczną danych wyjściowych do projektu, dodaj następujący kod:

    builder.AddRedisOutputCache("cache");
    
  10. Znajdź następujący wiersz kodu:

    var app = builder.Build();
    
  11. Bezpośrednio po tym wierszu, aby dodać oprogramowanie pośredniczące buforowania do potoku żądania, dodaj następujący kod:

    app.UseOutputCache();
    
  12. W Eksplorator rozwiązań rozwiń pozycję WebApp > Components > Pages, a następnie kliknij dwukrotnie plik Catalog.razor.

  13. Znajdź następujący wiersz kodu:

    @attribute [StreamRendering]
    
  14. Bezpośrednio po tym wierszu, aby buforować stronę główną, dodaj następujący kod:

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

Testowanie buforowania danych wyjściowych

Buforowanie danych wyjściowych jest teraz implementowane na stronie głównej Gór Północnych. Przetestujmy go:

  1. Aby uruchomić aplikację w programie Visual Studio, naciśnij F5 lub wybierz pozycję Debuguj > rozpocznij debugowanie.

  2. Po wyświetleniu pulpitu nawigacyjnego eShop .NET Aspire dla zasobu aplikacji internetowej wybierz jeden z punktów końcowych:

    Zrzut ekranu przedstawiający miejsce uruchamiania aplikacji internetowej na pulpicie nawigacyjnym platformy .NET Aspire.

  3. Punkt końcowy wyświetla stronę główną Góry Północne, w tym czas na serwerze.

  4. Naciśnij F5 , aby odświeżyć stronę. Ponieważ strona jest buforowana przez 10 sekund, czas wyświetlania zmienia się tylko wtedy, gdy jest ponad 10 sekund po buforowanym żądaniu.

  5. Przejdź do karty przeglądarki, na której jest wyświetlany pulpit nawigacyjny platformy .NET Aspire, a następnie w obszarze nawigacji po lewej stronie wybierz pozycję Ślady.

  6. Ślady z nazwą aplikacji internetowej: GET / są żądaniami dla strony głównej. Niektóre żądania do strony głównej, których nie można spełnić z pamięci podręcznej, mają podobne czasy do zanotowanych wcześniej czasów trwania. Jednak inne żądania, które są zwracane z pamięci podręcznej, mają znacznie krótszy czas trwania.

  7. W przypadku jednego z krótszych żądań wybierz pozycję Wyświetl w kolumnie Szczegóły . Zwróć uwagę, że żądanie zostało pobrane z pamięci podręcznej Redis:

    Zrzut ekranu przedstawiający pulpit nawigacyjny platformy .NET Aspire przedstawiający ślad dla buforowanego żądania.

  8. Zamknij stronę główną Góry Północne i pulpit nawigacyjny platformy .NET Aspire.

  9. W programie Visual Studio, aby zatrzymać debugowanie, naciśnij SHIFT — F5 lub wybierz pozycję Debuguj zatrzymaj > debugowanie.

Używanie rozproszonego buforowania

Możemy również użyć usługi Redis do wykonywania buforowania rozproszonego w projekcie Catalog.API :

  1. W programie Visual Studio w Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt Catalog.API, wybierz pozycję Dodaj, a następnie wybierz pakiet .NET Aspire.

  2. W polu tekstowym wyszukiwania na końcu istniejącego tekstu wpisz Redis.

  3. Wybierz pakiet Aspire.StackExchange.Redis.DistributedCaching .

  4. Na liście Wersja wybierz najnowszą wersję 8.0.0, a następnie wybierz pozycję Zainstaluj.

  5. Jeśli zostanie wyświetlone okno dialogowe Podgląd zmian, wybierz pozycję Zastosuj.

  6. W oknie dialogowym Akceptacja licencji wybierz pozycję Akceptuję.

  7. Po zakończeniu instalacji w Eksplorator rozwiązań rozwiń węzeł Catalog.API, a następnie kliknij dwukrotnie Program.cs.

  8. Znajdź następujący wiersz kodu:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Bezpośrednio po tym wierszu, aby dodać pamięć podręczną danych wyjściowych do projektu, dodaj następujący kod:

    builder.AddRedisDistributedCache("cache");
    
  10. W Eksplorator rozwiązań rozwiń węzeł Catalog.API > Apis, a następnie kliknij dwukrotnie CatalogApi.cs.

  11. Znajdź następujący kod, który deklaruje metodę GetAllItems :

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services)
    {
    
  12. Aby uzyskać pamięć podręczną Redis Cache za pomocą wstrzykiwania zależności, zmodyfikuj ten kod, aby dodać nowy parametr do metody :

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services,
        IDistributedCache cache)
    {
    
  13. Usuń całą zawartość GetAllItems metody i zastąp ją następującym kodem:

    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));
    }
    

Testowanie rozproszonego buforowania

Buforowanie rozproszone jest teraz implementowane w projekcie Catalog.API . Przetestujmy go:

  1. Aby uruchomić aplikację w programie Visual Studio, naciśnij F5 lub wybierz pozycję Debuguj > rozpocznij debugowanie.

  2. Po wyświetleniu pulpitu nawigacyjnego eShop .NET Aspire dla zasobu catalog-api wybierz punkt końcowy:

    Zrzut ekranu przedstawiający miejsce uruchamiania interfejsu API wykazu na pulpicie nawigacyjnym platformy .NET Aspire.

  3. Punkt końcowy wyświetla interfejs programu Swagger dla mikrousługi interfejsu API wykazu. Obok metody /api/v1/catalog/items wybierz pozycję GET.

  4. Wybierz pozycję Wypróbuj , a następnie wybierz pozycję Wykonaj. Wyniki są wyświetlane w oknie Treść odpowiedzi:

    Zrzut ekranu przedstawiający wyniki katalogu wyświetlane w interfejsie użytkownika struktury Swagger.

  5. Kliknij przycisk Wykonaj jeszcze kilka razy, aby ponownie wywołać interfejs API. Te żądania powinny pobierać elementy z pamięci podręcznej, o ile żądanie jest mniejsze niż 10 sekund po pierwszym.

  6. Przejdź do karty przeglądarki, na której jest wyświetlany pulpit nawigacyjny platformy .NET Aspire, a następnie w obszarze nawigacji po lewej stronie wybierz pozycję Ślady.

  7. Ślady z nazwą catalog-api: GET /api/v1/catalog/items to żądania metody items interfejsu API wykazu. Zwróć uwagę, że pierwsze żądanie do tej metody trwa dłużej, aby sformułować te kolejne żądania, które interfejs API uzyskuje elementy z pamięci podręcznej Redis Cache:

    Zrzut ekranu przedstawiający stronę Ślady pulpitu nawigacyjnego aspirującego platformy .NET z buforowanym żądaniami do interfejsu API wykazu.

  8. Zamknij stronę struktury Swagger i pulpit nawigacyjny platformy .NET Aspire.

  9. W programie Visual Studio, aby zatrzymać debugowanie, naciśnij SHIFT — F5 lub wybierz pozycję Debuguj zatrzymaj > debugowanie.