Oefening: Gegevens in Redis cachen
In deze oefening voegt u caching toe aan de gedeeltelijk voltooide cloudeigen app voor uw winkel voor buitenapparatuur. U voegt Redis toe aan het AppHost-project en implementeert vervolgens uitvoercaching in het WebApp-project en gedistribueerde caching in het Catalog.API-project .
Vereiste onderdelen installeren
De vereisten voor .NET Aspire zijn:
- .NET 8
- Visual Studio 2022 Preview
- Docker Desktop
- .NET Aspire-workload in Visual Studio
Als u deze pakketten al hebt geïnstalleerd, kunt u verdergaan met het werken met een Redis-cache.
.NET 8 installeren
Volg deze .NET 8-koppeling en selecteer het juiste installatieprogramma voor uw besturingssysteem. Als u bijvoorbeeld Windows 11 en een moderne processor gebruikt, selecteert u de x64 .NET 8 SDK voor Windows.
Nadat het downloaden is voltooid, voert u het installatieprogramma uit en volgt u de instructies. Voer in een terminalvenster de volgende opdracht uit om te controleren of de installatie is geslaagd:
dotnet --version
U ziet nu het versienummer van de .NET SDK die u hebt geïnstalleerd. Voorbeeld:
8.0.300-preview.24203.14
Visual Studio 2022 Preview installeren
Volg deze koppeling naar Visual Studio 2022 Preview en selecteer Voorbeeld downloaden. Nadat het downloaden is voltooid, voert u het installatieprogramma uit en volgt u de instructies.
Docker Desktop installeren
Volg deze Docker Desktop-koppeling en selecteer het juiste installatieprogramma voor uw besturingssysteem. Nadat het downloaden is voltooid, voert u het installatieprogramma uit en volgt u de instructies. Gebruik de WSL 2-back-end voor de beste prestaties en compatibiliteit.
Open de Docker Desktop-toepassing en accepteer de serviceovereenkomst.
De workload .NET Aspire installeren in Visual Studio
Installeer de .NET Aspire-workload met behulp van de .NET CLI:
Open een terminal.
Werk .NET-workloads bij met deze opdracht:
dotnet workload update
U ziet nu een bericht dat de workloads zijn bijgewerkt.
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): .
Installeer de workload .NET Aspire met deze opdracht:
dotnet workload install aspire
Als het goed is, ziet u een bericht dat de Workload Aspire is geïnstalleerd.
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.
Controleer of de workload .NET Aspire is geïnstalleerd met deze opdracht:
dotnet workload list
U ziet nu de details van de
aspire
workload.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.
De voorbeeld-app klonen en wijzigen
Laten we een git
voorbeeld-app verkrijgen die is gebouwd met .NET Aspire. De app heeft nog geen cache ingesteld:
Blader in de opdrachtregel naar een map van uw keuze waar u met code kunt werken.
Voer de volgende opdracht uit om de Northern Mountains eShop-voorbeeldtoepassing te klonen:
git clone -b aspire-cache https://github.com/MicrosoftDocs/mslearn-aspire-starter
Start Visual Studio en selecteer vervolgens Een project of oplossing openen.
Blader naar de map waarin u de eShop hebt gekloond, open de startmap en selecteer het eShop.rediscache.sln bestand en selecteer vervolgens Openen.
Blader in Solution Explorer naar WebApp/Components/Pages en dubbelklik vervolgens op Catalog.razor.
Zoek de volgende coderegel:
<SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment.</SectionContent>
Vervang die regel door de volgende code:
<SectionContent SectionName="page-header-subtitle">Start the season with the latest in clothing and equipment. It's @DateTime.Now</SectionContent>
Als u de app wilt starten, drukt u op F5 of selecteert u Foutopsporing> starten.
Als het dialoogvenster Docker Desktop starten wordt weergegeven, selecteert u Ja.
Wanneer het eShop .NET Aspire-dashboard wordt weergegeven, selecteert u voor de web-app-resource een van de eindpunten:
Het eindpunt geeft de startpagina van Northern Mountains weer. Inclusief de tijd op de server:
Druk op F5 om de pagina te vernieuwen. Omdat de pagina niet in de cache is opgeslagen, wordt de weergegeven tijd telkens gewijzigd wanneer u deze vernieuwt, zolang de seconde is gewijzigd.
Ga naar het browsertabblad waarin het .NET Aspire-dashboard wordt weergegeven en selecteer vervolgens Traceringen in de linkernavigatiebalk.
Traceringen met de naam web-app: GET / zijn aanvragen voor de startpagina. Noteer de typische duur voor deze aanvragen en selecteer vervolgens Voor een van deze aanvragen weergave in de kolom Details :
In de tijdlijnweergave ziet u dat web-app meerdere microservices aanroept om het antwoord samen te stellen.
Sluit de startpagina van Northern Mountains en het .NET Aspire-dashboard.
Als u in Visual Studio wilt stoppen met foutopsporing, drukt u op Shift - F5 of selecteert u Foutopsporing >stoppen.
Een back-upservice voor caching toevoegen
Nu u hebt gezien hoe de startpagina presteert zonder caching, gaan we uitvoercaching toevoegen om te zien of de reactiesnelheid wordt verbeterd. Voeg eerst het uitvoercachingonderdeel toe aan het AppHost-project :
Klik in Visual Studio in Solution Explorer met de rechtermuisknop op het project eShop.AppHost , selecteer Toevoegen en selecteer vervolgens .NET Aspire-pakket.
Typ Redis in het zoektekstvak aan het einde van de bestaande tekst.
Selecteer Het pakket Aspire.Hosting.Redis .
Selecteer in de lijst Versie de meest recente versie 8.0.0 en selecteer Vervolgens Installeren.
Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.
Vouw in Solution Explorer het AppHost-project uit en dubbelklik op Program.cs.
Zoek de volgende regels code:
// Databases var postgres = builder.AddPostgres("postgres").WithPgAdmin(); var catalogDb = postgres.AddDatabase("CatalogDB");
Voeg direct na deze regels de volgende code toe:
// Cache var redis = builder.AddRedis("cache");
Zoek de volgende coderegel, waarmee het Catalog API-project wordt toegevoegd aan .NET Aspire-indeling:
var catalogApi = builder.AddProject<Catalog_API>("catalog-api") .WithReference(catalogDb);
Als u de Redis-cache wilt doorgeven aan het Catalogus-API-project, vervangt u die code door de volgende regels:
var catalogApi = builder.AddProject<Catalog_API>("catalog-api") .WithReference(catalogDb) .WithReference(redis);
Notitie
We gebruiken de cache in de Catalogus-API om gedistribueerde caching uit te voeren.
Zoek de volgende coderegel, waarmee het WebApp-project wordt toegevoegd aan .NET Aspire-indeling:
builder.AddProject<WebApp>("webapp") .WithReference(catalogApi);
Als u de Redis-cache wilt doorgeven aan het WebApp-project, vervangt u die code door de volgende regels:
builder.AddProject<WebApp>("webapp") .WithReference(catalogApi) .WithReference(redis);
Notitie
We gebruiken de cache in de web-app om uitvoercache uit te voeren.
Als u het Program.cs-bestand wilt opslaan, drukt u op Ctrl - S of selecteert u Bestand > opslaan Program.cs.
Uitvoercache gebruiken in het WebApp-project
Nu gaan we de Redis-cache in het WebApp-project gebruiken om de uitvoer van de startpagina in de cache op te cachen:
Klik in Visual Studio in Solution Explorer met de rechtermuisknop op het WebApp-project , selecteer Toevoegen en selecteer vervolgens .NET Aspire-pakket.
Typ Redis in het zoektekstvak aan het einde van de bestaande tekst.
Selecteer Het pakket Aspire.StackExchange.Redis.OutputCaching .
Selecteer in de lijst Versie de meest recente versie 8.0.0 en selecteer Vervolgens Installeren.
Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.
Wanneer de installatie is voltooid, vouwt u in Solution Explorer WebApp uit en dubbelklikt u op Program.cs.
Zoek de volgende coderegel:
var builder = WebApplication.CreateBuilder(args);
Voeg direct na die regel de uitvoercache toe aan het project door deze code toe te voegen:
builder.AddRedisOutputCache("cache");
Zoek de volgende coderegel:
var app = builder.Build();
Voeg direct na die regel de caching-middleware toe aan de aanvraagpijplijn door deze code toe te voegen:
app.UseOutputCache();
Vouw in Solution Explorer Pagina's van WebApp-onderdelen > > uit en dubbelklik vervolgens op Catalog.razor.
Zoek de volgende coderegel:
@attribute [StreamRendering]
Voeg direct na die regel deze code toe om de startpagina in de cache op te plaatsen:
@attribute [Microsoft.AspNetCore.OutputCaching.OutputCache(Duration = 10)]
Uitvoercache testen
Uitvoercache wordt nu geïmplementeerd op de startpagina van Northern Mountains. Laten we het testen:
Druk in Visual Studio op F5 om de app te starten of selecteer Foutopsporing >starten.
Wanneer het eShop .NET Aspire-dashboard wordt weergegeven, selecteert u voor de web-app-resource een van de eindpunten:
Het eindpunt geeft de startpagina van Northern Mountains weer, inclusief de tijd op de server.
Druk op F5 om de pagina te vernieuwen. Omdat de pagina gedurende 10 seconden in de cache wordt opgeslagen, wordt de weergegeven tijd alleen gewijzigd wanneer deze langer dan 10 seconden na de aanvraag in de cache is.
Ga naar het browsertabblad waarin het .NET Aspire-dashboard wordt weergegeven en selecteer vervolgens Traceringen in de linkernavigatiebalk.
Traceringen met de naam web-app: GET / zijn aanvragen voor de startpagina. Sommige aanvragen voor de startpagina, die niet kunnen worden voldaan vanuit de cache, hebben vergelijkbare tijdsinstellingen als de duur die u eerder hebt genoteerd. Andere aanvragen, die worden geretourneerd uit de cache, hebben echter aanzienlijk kortere duur.
Selecteer Weergeven in de kolom Details voor een van de kortere aanvragen. U ziet dat de aanvraag is opgehaald uit de Redis-cache:
Sluit de startpagina van Northern Mountains en het .NET Aspire-dashboard.
Als u in Visual Studio wilt stoppen met foutopsporing, drukt u op Shift - F5 of selecteert u Foutopsporing >stoppen.
Gedistribueerde caching gebruiken
We kunnen Redis ook gebruiken om gedistribueerde caching uit te voeren in het Catalog.API-project :
Klik in Visual Studio in Solution Explorer met de rechtermuisknop op het project Catalog.API , selecteer Toevoegen en selecteer vervolgens .NET Aspire-pakket.
Typ Redis in het zoektekstvak aan het einde van de bestaande tekst.
Selecteer Het pakket Aspire.StackExchange.Redis.DistributedCaching .
Selecteer in de lijst Versie de meest recente versie 8.0.0 en selecteer Vervolgens Installeren.
Als het dialoogvenster Voorbeeldwijzigingen wordt weergegeven, selecteert u Toepassen.
Selecteer In het dialoogvenster Licentie accepteren de optie Accepteren.
Wanneer de installatie is voltooid, vouwt u Catalog.API uit in Solution Explorer en dubbelklikt u op Program.cs.
Zoek de volgende coderegel:
var builder = WebApplication.CreateBuilder(args);
Voeg direct na die regel de uitvoercache toe aan het project door deze code toe te voegen:
builder.AddRedisDistributedCache("cache");
Vouw catalog.API-api's in Solution Explorer uit en dubbelklik vervolgens op CatalogApi.cs.>
Zoek de volgende code, die de
GetAllItems
methode declareert:public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems( [AsParameters] PaginationRequest paginationRequest, [AsParameters] CatalogServices services) {
Als u de Redis-cache wilt verkrijgen via afhankelijkheidsinjectie, wijzigt u die code om een nieuwe parameter toe te voegen aan de methode:
public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems( [AsParameters] PaginationRequest paginationRequest, [AsParameters] CatalogServices services, IDistributedCache cache) {
Verwijder de volledige inhoud van de
GetAllItems
methode en vervang deze door de volgende code: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)); }
Gedistribueerde caching testen
Gedistribueerde caching is nu geïmplementeerd in het Catalog.API-project . Laten we het testen:
Druk in Visual Studio op F5 om de app te starten of selecteer Foutopsporing >starten.
Wanneer het eShop .NET Aspire-dashboard wordt weergegeven, selecteert u het eindpunt voor de catalogus-API-resource :
Het eindpunt geeft de Swagger-interface weer voor de microservice van de Catalogus-API . Selecteer GET naast de methode /api/v1/catalog/items.
Selecteer Uitproberen en selecteer vervolgens Uitvoeren. Resultaten worden weergegeven in het venster Antwoordtekst :
Klik nogmaals op Uitvoeren om de API opnieuw aan te roepen. Deze aanvragen moeten de items ophalen uit de cache, zolang de aanvraag minder dan 10 seconden na de eerste aanvraag is.
Ga naar het browsertabblad waarin het .NET Aspire-dashboard wordt weergegeven en selecteer vervolgens Traceringen in de linkernavigatiebalk.
Traceringen met de naam catalog-api: GET /api/v1/catalog/items zijn aanvragen voor de itemsmethode van de Catalogus-API. U ziet dat het langer duurt voordat de eerste aanvraag voor die methode de volgende aanvragen formuleert, waarmee de API de items uit de Redis-cache verkrijgt:
Sluit de Swagger-pagina en het .NET Aspire-dashboard.
Als u in Visual Studio wilt stoppen met foutopsporing, drukt u op Shift - F5 of selecteert u Foutopsporing >stoppen.