Redis 出力キャッシュの使用
要求が複雑な場合、HTML を構築してクライアントに返すまで時間がかかり、複数のマイクロサービスに問い合わせる必要があります。 この HTML やその他の出力コードは通常、キャッシュの候補となります。
あなたはアウトドア用機器の販売店で働いているとします。 ご利用の新しい Web アプリには、ユーザー インターフェイスを構築し、ブラウザーに HTML を返すマイクロサービスが含まれています。 そのパフォーマンスが最適になるようにします。
このユニットでは、出力キャッシュと、Redis と .NET Aspire を使用してマイクロサービスにそれを実装する方法について説明します。
出力キャッシュとは?
Web アプリに完全な HTML ページを保存するとき、あるいは出力の一部を Minimal API 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 Web アプリ、Minimal 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
Minimal API で出力をキャッシュする
Minimal API は、HTTP Web サービスをすばやく実装するプロジェクトです。 スキャフォールディングと不要なコントローラーを回避することで、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}.");