Redis 출력 캐시 사용
복잡한 요청에 대해 클라이언트에 반환되는 HTML을 구성하는 데는 시간이 걸릴 수 있으며 여러 마이크로 서비스에 대한 쿼리가 필요할 수 있습니다. 이 HTML 또는 기타 출력 코드는 캐싱의 일반적인 후보입니다.
아웃도어 장비 소매업체에서 일한다고 상상해 보세요. 새 웹앱에는 사용자 인터페이스를 구성하고 HTML을 브라우저에 반환하는 마이크로 서비스가 포함되어 있습니다. 최적의 성능을 보장하려고 합니다.
이 단원에서는 출력 캐싱에 대해 알아보고 Redis 및 .NET Aspire를 사용하여 마이크로 서비스에서 이를 구현하는 방법을 알아봅니다.
출력 캐시란?
웹앱에 전체 HTML 페이지를 저장하거나 최소 API로 출력의 작은 부분을 저장하려는 경우 출력 캐시를 사용합니다. 앱 홈페이지와 같이 자주 요청되는 페이지를 캐싱하여 최적의 성능 개선을 가져올 수 있습니다.
.NET Aspire에서 출력 캐싱 설정
설치 및 구성 단계는 소비 프로젝트에 출력 캐싱 구성 요소를 설치한다는 점을 제외하면 분산 캐싱 구성 요소와 동일합니다.
앱 호스트 구성
앱 호스트에서 분산 캐싱에 사용한 것과 동일한 Redis 호스팅 구성 요소를 설치합니다.
dotnet add package Aspire.Hosting.Redis --prerelease
등록 코드는 정확히 동일합니다. 분산 캐싱을 위해 아직 추가하지 않은 경우에만 이 코드를 추가하면 됩니다.
// Register the cache
var redis = builder.AddRedis("redis");
// Initiate the consuming project and pass the cache
builder.AddProject<Projects.ConsumingProject>()
.WithReference(redis);
소비 프로젝트 구성
마이크로 서비스 프로젝트에서 Redis 출력 캐싱 구성 요소를 추가합니다.
dotnet add package Aspire.StackExchange.Redis.OutputCaching
출력 캐시 사용
일반적으로 소비 프로젝트는 앱의 사용자 인터페이스를 생성하는 마이크로 서비스입니다. 예를 들어, ASP.NET, Blazor 웹앱 또는 최소 API일 수 있습니다. 앱에 출력 캐시를 추가한 후 다음과 같이 프로젝트에 미들웨어를 추가해야 합니다.
// Add the output cache
builder.AddRedisOutputCache();
// Build the app
var app = builder.Build();
// Add the middleware
app.UseOutputCache();
전체 페이지 캐싱
페이지를 캐시하려면 다음 Razor 페이지와 같이 OutputCache
특성을 사용합니다.
@page "/"
@attribute [OutputCache(Duration = 10)]
<PageTitle>Welcome to Contoso</PageTitle>
<h1>Welcome to Contoso</h1>
This is our homepage. The time is: @DateTime.Now
최소 API로 출력 캐싱
최소 API는 HTTP 웹 서비스를 빠르게 구현하는 프로젝트입니다. 스캐폴딩과 불필요한 컨트롤러를 방지하여 RESTful API를 빌드하는 데 필요한 코드를 줄입니다. 대신 API 작업과 경로가 직접 선언됩니다.
이 예에서는 사용자가 제품 ID를 요청할 때 간단한 응답이 반환됩니다.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/products/{ProdId}",
(int ProdId) => $"The product ID is {ProdId}.");
app.Run();
이 응답을 캐시하려면 CacheOutput()
메서드를 호출하거나 MapGet
호출에 OutputCache
특성을 적용합니다.
app.MapGet("/products/{ProdId}", (int ProdId) => $"The product ID is {ProdId}.").CacheOutput();
app.MapGet("/products/{ProdId}", [OutputCache] (int ProdId) => $"The product ID is {ProdId}.");