チュートリアル: .NET.NET Aspire 統合を使用してキャッシュを実装する
多くの場合、クラウドネイティブ アプリでは、パフォーマンスを向上させるために、さまざまな種類のスケーラブルなキャッシュ ソリューションが必要です。 .NET Aspire 統合により、Redisなどの一般的なキャッシュ サービスに接続するプロセスが簡略化されます。 この記事では、次の方法について説明します。
- ASP.NETを使用するように設定された基本的な .NET Aspire コア アプリを作成します。
- .NET Aspire 統合を追加して、Redis に接続し、キャッシュを実装します。
- 特定の要件を満たすように .NET.NET Aspire 統合を構成します。
この記事では、ASP.NET Core と .NET Aspireを使用して 2 種類の Redis キャッシュを使用する方法について説明します。
- 出力キャッシュ: 将来の要求に対して HTTP 応答全体を格納するための、構成可能で拡張可能なキャッシュ方法です。
- 分散キャッシュ: 特定のデータをキャッシュできる複数のアプリ サーバーによって共有されるキャッシュ。 分散キャッシュは通常、アクセスするアプリ サーバーの外部サービスとして保持され、ASP.NET Core アプリのパフォーマンスとスケーラビリティを向上させることができます。
前提 条件
.NET .NET Aspireを使用するには、次のものがローカルにインストールされている必要があります。
- .NET 8.0 または .NET 9.0
- OCI 準拠のコンテナー ランタイム。次に例を示します。
- デスクトップ または
を します。 詳細については、「コンテナーランタイム」を参照してください。
- デスクトップ または
- 次のような統合開発者環境 (IDE) またはコード エディター。
- Visual Studio 2022 バージョン 17.9 以降 (省略可能)
-
Visual Studio Code (省略可能)
- C# Dev Kit: 拡張機能(オプション)
- JetBrains Rider と .NET.NET Aspire プラグイン (省略可能)
詳細については、
プロジェクトを作成する
- Visual Studioの上部にある [ファイル]>[新しい>プロジェクト]...に移動します。
- ダイアログ ウィンドウで、プロジェクト テンプレートの検索ボックスに「
」と入力し、[スタート アプリケーション 選択します。 [次 ] を選択します。 - [新しいプロジェクトの構成] 画面で、次の手順を実行します。
のプロジェクト名 。を入力 - 値の
は既定値のままにし、[次へ] 選択します。
-
追加情報 画面で、次の手順を実行します。
- .NET 9.0 が選択されていることを確認します。
キャッシュに を使用する] チェック ボックスをオフにします。 独自のキャッシュ設定を実装します。 - [作成] を選択します。
Visual Studio は、次のプロジェクトで構成される新しい .NET Aspire ソリューションを作成します。
- AspireRedis.Web - 既定の Blazor 構成を持つ .NET Aspire UI プロジェクト。
- AspireRedis.ApiService - フロントエンドにデータを提供する既定の .NET.NET Aspire 構成を持つ最小限の API。
- AspireRedis.AppHost - アプリのさまざまなプロジェクトとサービスを接続して構成するように設計されたオーケストレーター プロジェクトです。
AspireRedis.ServiceDefaults - ソリューション内のプロジェクト全体で再利用される構成を管理するための共有プロジェクトで、回復性、 サービス検出 、テレメトリ関連します。
App Host プロジェクトを構成する
AspireRedis.AppHost
します。dotnet add package Aspire.Hosting.Redis
詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。
次のコードに一致するように、Program.cs プロジェクトの
AspireRedis.AppHost
ファイルを更新します。var builder = DistributedApplication.CreateBuilder(args); var redis = builder.AddRedis("cache"); var apiservice = builder.AddProject<Projects.AspireRedis_ApiService>("apiservice") .WithReference(redis); builder.AddProject<Projects.AspireRedis_Web>("webfrontend") .WithExternalHttpEndpoints() .WithReference(apiservice) .WithReference(redis); builder.Build().Run();
上記のコードは、ローカル Redis コンテナー インスタンスを作成し、出力キャッシュと分散キャッシュの両方でインスタンスを自動的に使用するように UI と API を構成します。 また、このコードでは、サービス検出を使用してフロントエンド UI とバックエンド API の間の通信を構成します。 .NET .NET Aspireの暗黙的なサービス検出により、サービス接続の設定と管理が合理化され、開発者の生産性が向上します。 このチュートリアルのコンテキストでは、この機能を使用すると、Redisに接続する方法が簡略化されます。
従来は、各プロジェクトの Redis ファイルで appsettings.json 接続文字列を手動で指定しました。
{
"ConnectionStrings": {
"cache": "localhost:6379"
}
}
このメソッドを使用して接続文字列を構成するには、機能しながら、複数のプロジェクト間で接続文字列を複製する必要があります。この場合、煩雑でエラーが発生しやすくなります。
出力キャッシュを使用して UI を構成する
.NET Aspire アプリに
AspireRedis.Web
統合パッケージを追加します。dotnet add package Aspire.StackExchange.Redis.OutputCaching
Program.cs
AspireRedis.Web
プロジェクトの Blazor ファイルで、var builder = WebApplication.CreateBuilder(args);
行の直後に、AddRedisOutputCache 拡張メソッドの呼び出しを追加します。builder.AddRedisOutputCache("cache");
このメソッドは、次のタスクを実行します。
- 指定された接続名を持つ ASP.NET Core インスタンスを使用して Redis 出力キャッシュを構成します。
- 対応する正常性チェック、ログ記録、テレメトリを自動的に有効にします。
AspireRedis.Web
プロジェクトの Blazor ファイルの内容を次のように置き換えます。@page "/" @attribute [OutputCache(Duration = 10)] <PageTitle>Home</PageTitle> <h1>Hello, world!</h1> Welcome to your new app on @DateTime.Now
統合には、レンダリングされた応答全体をキャッシュする
[OutputCache]
属性が含まれます。 このページには、応答がキャッシュされていることを確認するのに役立つ@DateTime.Now
の呼び出しも含まれています。
分散キャッシュを使用して API を構成する
.NET Aspire Stack Exchange Redis 分散キャッシュ 統合パッケージを
AspireRedis.ApiService
アプリに追加します。dotnet add package Aspire.StackExchange.Redis.DistributedCaching
Program.cs ファイルの先頭に、AddRedisDistributedCacheへの呼び出しを追加します。
builder.AddRedisDistributedCache("cache");
Program.cs ファイルに、次の
using
ステートメントを追加します。using System.Text; using System.Text.Json; using Microsoft.Extensions.Caching.Distributed;
Program.cs ファイルで、既存の
/weatherforecast
エンドポイント コードを次のように置き換えます。app.MapGet("/weatherforecast", async (IDistributedCache cache) => { var cachedForecast = await cache.GetAsync("forecast"); if (cachedForecast is null) { var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateOnly.FromDateTime(DateTime.Now.AddDays(index)), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); await cache.SetAsync("forecast", Encoding.UTF8.GetBytes(JsonSerializer.Serialize(forecast)), new () { AbsoluteExpiration = DateTime.Now.AddSeconds(10) }); ; return forecast; } return JsonSerializer.Deserialize<IEnumerable<WeatherForecast>>(cachedForecast); }) .WithName("GetWeatherForecast");
アプリをローカルでテストする
次の手順を使用して、アプリのキャッシュ動作をテストします。
- F5キー
押して、 を使用してアプリを実行します。 - [Docker デスクトップ 開始] ダイアログが表示されたら、[はい] を選択してサービスを開始します。
- .NET .NET Aspire ダッシュボードがブラウザーに読み込み、UI プロジェクトと API プロジェクトが一覧表示されます。
出力キャッシュをテストします。
- [プロジェクト] ページの [webfrontend] 行で、[
localhost
列の リンクをクリックして、アプリの UI を開きます。 - アプリケーションは、ホーム ページに現在の時刻を表示します。
- ブラウザーを数秒ごとに更新して、出力キャッシュによって返されたのと同じページを表示します。 10 秒後にキャッシュの有効期限が切れ、ページが更新された時刻で再読み込みされます。
分散キャッシュをテストします。
- UI の Blazor ページに移動して、ランダム化された気象データのテーブルを読み込みます。
- ブラウザーを数秒ごとに更新して、出力キャッシュによって返されるのと同じ気象データを確認します。 10 秒後にキャッシュの有効期限が切れ、ページが更新された気象データで再読み込みされます。
おめでとうございます! ASP.NET Coreで出力と分散キャッシュを使用するように .NET Aspire アプリを構成しました。
.NET Aspire