Cvičení – ukládání dat do mezipaměti v Redisu

Dokončeno

V tomto cvičení přidáte ukládání do mezipaměti do částečně dokončené aplikace nativní pro cloud pro prodejce venkovních zařízení. Do projektu AppHost přidáte Redis a pak do projektu WebApp implementujete ukládání výstupu do mezipaměti a distribuované ukládání do mezipaměti v projektu Catalog.API.

Požadavky na instalaci

Požadavky pro .NET Aspire jsou:

  • .NET 8
  • Visual Studio 2022 Preview
  • Docker Desktop
  • Úloha .NET Aspire v sadě Visual Studio

Pokud už máte tyto balíčky nainstalované, můžete přeskočit a začít pracovat s mezipamětí Redis.

Instalace .NET 8

Postupujte podle tohoto odkazu na .NET 8 a vyberte správný instalační program pro váš operační systém. Pokud například používáte Windows 11 a moderní procesor, vyberte sadu x64 .NET 8 SDK pro Windows.

Po dokončení stahování spusťte instalační program a postupujte podle pokynů. V okně terminálu spusťte následující příkaz a ověřte, že instalace proběhla úspěšně:

dotnet --version

Měli byste vidět číslo verze sady .NET SDK, kterou jste nainstalovali. Příklad:

8.0.300-preview.24203.14

Instalace sady Visual Studio 2022 Preview

Postupujte podle tohoto odkazu sady Visual Studio 2022 Preview a vyberte Stáhnout verzi Preview. Po dokončení stahování spusťte instalační program a postupujte podle pokynů.

Instalace Docker Desktopu

Postupujte podle tohoto odkazu na Docker Desktop a vyberte správný instalační program pro váš operační systém. Po dokončení stahování spusťte instalační program a postupujte podle pokynů. Pro zajištění nejlepšího výkonu a kompatibility použijte back-end WSL 2.

Otevřete aplikaci Docker Desktop a přijměte smlouvu o poskytování služeb.

Instalace úlohy .NET Aspire v sadě Visual Studio

Nainstalujte úlohu .NET Aspire pomocí rozhraní příkazového řádku .NET:

  1. Otevřete terminál.

  2. Aktualizujte úlohy .NET pomocí tohoto příkazu:

    dotnet workload update
    

    Měla by se zobrazit zpráva, že se úlohy úspěšně aktualizovaly.

    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. Pomocí tohoto příkazu nainstalujte úlohu .NET Aspire:

    dotnet workload install aspire
    

    Měla by se zobrazit zpráva, že byla nainstalována úloha 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. Pomocí tohoto příkazu ověřte, že je nainstalovaná úloha .NET Aspire:

    dotnet workload list
    

    Měli byste vidět podrobnosti o aspire úloze.

    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.
    

Klonování a úprava ukázkové aplikace

Pojďme použít git k získání ukázkové aplikace vytvořené pomocí .NET Aspire. Aplikace ještě nemá nastavené ukládání do mezipaměti:

  1. Na příkazovém řádku přejděte do složky podle vašeho výběru, kde můžete pracovat s kódem.

  2. Spuštěním následujícího příkazu naklonujte ukázkovou aplikaci Northern Mountains eShop :

    git clone -b aspire-cache https://github.com/MicrosoftDocs/mslearn-aspire-starter
    
  3. Spusťte Visual Studio a pak vyberte Otevřít projekt nebo řešení.

  4. Přejděte do složky, do které jste naklonovali eShop, otevřete počáteční složku a vyberte eShop.rediscache.sln soubor a pak vyberte Otevřít.

  5. V Průzkumník řešení přejděte na WebApp/Components/Pages a poklikejte na Catalog.razor.

  6. Najděte tento řádek kódu:

    <SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment.</SectionContent>
    
  7. Tento řádek nahraďte následujícím kódem:

    <SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment. It's @DateTime.Now</SectionContent>
    
  8. Aplikaci spustíte stisknutím klávesy F5 nebo výběrem možnosti> Spustit ladění.

  9. Pokud se zobrazí dialogové okno Start Docker Desktop , vyberte Ano.

  10. Když se zobrazí řídicí panel eShop .NET Aspire pro prostředek webové aplikace, vyberte jeden z koncových bodů:

    Snímek obrazovky znázorňující, kde spustit webovou aplikaci na řídicím panelu .NET Aspire

  11. Koncový bod zobrazuje domovskou stránku Severní hory. Včetně času na serveru:

    Snímek obrazovky zobrazující domovskou stránku Severní hory se zobrazeným časem na straně serveru

  12. Stisknutím klávesy F5 aktualizujte stránku. Vzhledem k tomu, že stránka není uložená v mezipaměti, čas se při každé aktualizaci změní, pokud se druhý změnil.

  13. Přejděte na kartu prohlížeče, která zobrazuje řídicí panel .NET Aspire, a v levém navigačním panelu vyberte Trasování.

  14. Trasování s názvem webové aplikace: GET / jsou požadavky na domovskou stránku. Poznamenejte si typickou dobu trvání těchto požadavků a pak u některého z nich vyberte Zobrazit ve sloupci Podrobnosti :

    Snímek obrazovky s řídicím panelem .NET Aspire zobrazující trasování žádostí na domovskou stránku Severní hory bez ukládání do mezipaměti

  15. V zobrazení časové osy si všimněte, že webová aplikace volá více mikroslužeb k vytvoření odpovědi.

  16. Zavřete domovskou stránku Severní hory a řídicí panel .NET Aspire.

  17. Pokud chcete v sadě Visual Studio zastavit ladění, stiskněte shift – F5 nebo vyberte Ladění > zastavit ladění.

Přidání backingové služby ukládání do mezipaměti

Teď, když jste viděli, jak domovská stránka funguje bez ukládání do mezipaměti, přidáme výstupní ukládání do mezipaměti, abychom zjistili, jestli zlepšuje rychlost odezvy. Začněte přidáním komponenty ukládání výstupu do mezipaměti do projektu AppHost :

  1. V sadě Visual Studio klikněte v Průzkumník řešení pravým tlačítkem na projekt eShop.AppHost, vyberte Přidat a pak vyberte balíček .NET Aspire.

  2. Do vyhledávacího textového pole na konci existujícího textu zadejte Redis.

  3. Vyberte balíček Aspire.Hosting.Redis .

  4. V seznamu verzí vyberte nejnovější verzi 8.0.0 a pak vyberte Nainstalovat.

  5. Pokud se zobrazí dialogové okno Náhled změn, vyberte Použít.

  6. V dialogovém okně Přijetí licence vyberte Přijmout.

  7. V Průzkumník řešení rozbalte projekt AppHost a poklikejte na Program.cs.

  8. Vyhledejte následující řádky kódu:

    // Databases
    
    var postgres = builder.AddPostgres("postgres").WithPgAdmin();
    var catalogDb = postgres.AddDatabase("CatalogDB");
    
  9. Bezprostředně za tyto řádky přidejte následující kód:

    // Cache
    var redis = builder.AddRedis("cache");
    
  10. Vyhledejte následující řádek kódu, který přidá projekt rozhraní API katalogu do orchestrace .NET Aspire:

    var catalogApi = builder.AddProject<Catalog_API>("catalog-api")
        .WithReference(catalogDb);
    
  11. Pokud chcete předat mezipaměť Redis do projektu rozhraní API katalogu, nahraďte tento kód následujícími řádky:

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

    Poznámka:

    K distribuované mezipaměti použijeme mezipaměť v rozhraní API katalogu.

  12. Vyhledejte následující řádek kódu, který přidá projekt webové aplikace do orchestrace .NET Aspire:

    builder.AddProject<WebApp>("webapp")
        .WithReference(catalogApi);
    
  13. Pokud chcete předat mezipaměť Redis do projektu webové aplikace, nahraďte tento kód následujícími řádky:

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

    Poznámka:

    K ukládání výstupu do mezipaměti použijeme mezipaměť ve webové aplikaci.

  14. Pokud chcete soubor Program.cs uložit, stiskněte ctrl – S nebo vyberte Program.cs Uložit soubor>.

Použití ukládání výstupu do mezipaměti v projektu webové aplikace

Teď použijeme mezipaměť Redis v projektu webové aplikace k uložení výstupu domovské stránky do mezipaměti:

  1. V sadě Visual Studio klikněte v Průzkumník řešení pravým tlačítkem myši na projekt webové aplikace, vyberte Přidat a pak vyberte balíček .NET Aspire.

  2. Do vyhledávacího textového pole na konci existujícího textu zadejte Redis.

  3. Vyberte balíček Aspire.StackExchange.Redis.OutputCaching .

  4. V seznamu verzí vyberte nejnovější verzi 8.0.0 a pak vyberte Nainstalovat.

  5. Pokud se zobrazí dialogové okno Náhled změn, vyberte Použít.

  6. V dialogovém okně Přijetí licence vyberte Přijmout.

  7. Po dokončení instalace v Průzkumník řešení rozbalte webovou aplikaci a poklikejte na Program.cs.

  8. Najděte tento řádek kódu:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Hned za tento řádek přidejte výstupní mezipaměť do projektu a přidejte tento kód:

    builder.AddRedisOutputCache("cache");
    
  10. Najděte tento řádek kódu:

    var app = builder.Build();
    
  11. Hned za tento řádek přidejte middleware pro ukládání do mezipaměti do kanálu požadavku a přidejte tento kód:

    app.UseOutputCache();
    
  12. V Průzkumník řešení rozbalte položku WebApp > Components > Pages a potom poklikejte na Catalog.razor.

  13. Najděte tento řádek kódu:

    @attribute [StreamRendering]
    
  14. Hned za tento řádek přidejte tento kód do mezipaměti domovské stránky:

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

Ukládání výstupu do testovacího mezipaměti

Ukládání výstupu do mezipaměti se teď implementuje na domovské stránce Severní hory. Pojďme to otestovat:

  1. V sadě Visual Studio spusťte aplikaci stisknutím klávesy F5 nebo vyberte > Spustit ladění.

  2. Když se zobrazí řídicí panel eShop .NET Aspire pro prostředek webové aplikace, vyberte jeden z koncových bodů:

    Snímek obrazovky znázorňující, kde spustit webovou aplikaci na řídicím panelu .NET Aspire

  3. Koncový bod zobrazí domovskou stránku Severní hory včetně času na serveru.

  4. Stisknutím klávesy F5 aktualizujte stránku. Vzhledem k tomu, že se stránka ukládá do mezipaměti po dobu 10 sekund, čas zobrazený čas se změní jenom v případě, že je delší než 10 sekund od požadavku uloženého v mezipaměti.

  5. Přejděte na kartu prohlížeče, která zobrazuje řídicí panel .NET Aspire, a v levém navigačním panelu vyberte Trasování.

  6. Trasování s názvem webové aplikace: GET / jsou požadavky na domovskou stránku. Některé požadavky na domovskou stránku, které nemohly být splněny z mezipaměti, mají podobné časování jako doby trvání, kterou jste si poznamenali dříve. Jiné požadavky, které se vrátí z mezipaměti, však mají výrazně kratší dobu trvání.

  7. Pro jeden z kratších požadavků vyberte Zobrazit ve sloupci Podrobnosti . Všimněte si, že požadavek se načetl z mezipaměti Redis:

    Snímek obrazovky s řídicím panelem .NET Aspire zobrazující trasování požadavku v mezipaměti

  8. Zavřete domovskou stránku Severní hory a řídicí panel .NET Aspire.

  9. Pokud chcete v sadě Visual Studio zastavit ladění, stiskněte shift – F5 nebo vyberte Ladění > zastavit ladění.

Použití distribuované mezipaměti

Můžeme také použít Redis k provádění distribuované mezipaměti v projektu Catalog.API :

  1. V sadě Visual Studio klikněte v Průzkumník řešení pravým tlačítkem na projekt Catalog.API, vyberte Přidat a pak vyberte balíček .NET Aspire.

  2. Do vyhledávacího textového pole na konci existujícího textu zadejte Redis.

  3. Vyberte balíček Aspire.StackExchange.Redis.DistributedCaching .

  4. V seznamu verzí vyberte nejnovější verzi 8.0.0 a pak vyberte Nainstalovat.

  5. Pokud se zobrazí dialogové okno Náhled změn, vyberte Použít.

  6. V dialogovém okně Přijetí licence vyberte Přijmout.

  7. Po dokončení instalace v Průzkumník řešení rozbalte catalog.API a poklikejte na Program.cs.

  8. Najděte tento řádek kódu:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Hned za tento řádek přidejte výstupní mezipaměť do projektu a přidejte tento kód:

    builder.AddRedisDistributedCache("cache");
    
  10. V Průzkumník řešení rozbalte položku Catalog.API > Apis a poklikejte na CatalogApi.cs.

  11. Vyhledejte následující kód, který deklaruje metodu GetAllItems :

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services)
    {
    
  12. Pokud chcete získat mezipaměť Redis prostřednictvím injektáže závislostí, upravte tento kód tak, aby do metody přidal nový parametr:

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services,
        IDistributedCache cache)
    {
    
  13. Odeberte celý obsah GetAllItems metody a nahraďte ho následujícím kódem:

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

Testování distribuované mezipaměti

Distribuované ukládání do mezipaměti se teď implementuje v projektu Catalog.API . Pojďme to otestovat:

  1. V sadě Visual Studio spusťte aplikaci stisknutím klávesy F5 nebo vyberte > Spustit ladění.

  2. Po zobrazení řídicího panelu eShop .NET Aspire vyberte pro prostředek catalog-api koncový bod:

    Snímek obrazovky znázorňující, kde spustit rozhraní API katalogu na řídicím panelu .NET Aspire

  3. Koncový bod zobrazí rozhraní Swagger pro mikroslužbu rozhraní API katalogu. Vedle metody /api/v1/catalog/items vyberte GET.

  4. Vyberte Vyzkoušet a pak vyberte Spustit. Výsledky se zobrazí v okně textu odpovědi:

    Snímek obrazovky zobrazující výsledky katalogu zobrazené v uživatelském rozhraní Swaggeru

  5. Dalším kliknutím na Spustit znovu volejte rozhraní API. Tyto požadavky by měly získat položky z mezipaměti, pokud je požadavek kratší než 10 sekund po prvním požadavku.

  6. Přejděte na kartu prohlížeče, která zobrazuje řídicí panel .NET Aspire, a v levém navigačním panelu vyberte Trasování.

  7. Trasování s názvem catalog-api: GET /api/v1/catalog/items jsou požadavky na metodu položek rozhraní API katalogu. Všimněte si, že první požadavek na danou metodu trvá delší dobu, než formuluje následující požadavky, které rozhraní API získá z mezipaměti Redis:

    Snímek obrazovky se stránkou trasování řídicího panelu .NET Aspire s požadavky uloženými v mezipaměti do rozhraní API katalogu

  8. Zavřete stránku Swaggeru a řídicí panel .NET Aspire.

  9. Pokud chcete v sadě Visual Studio zastavit ladění, stiskněte shift – F5 nebo vyberte Ladění > zastavit ladění.