Redis 分散キャッシュの使用

完了

クラウドネイティブ アプリでは、個々のチームが独自のスケジュールで任意のテクノロジを使用してマイクロサービスを構築します。 通常、マイクロサービスは完全に独立して動作します。 これはキャッシュの恩恵を受けられることもありますが、個別のキャッシュを実行すると、最適なパフォーマンスの向上を実現できない可能性があります。 複数のマイクロサービスに 1 つのキャッシュを用意すると、それらのサービスは、別のマイクロサービスによって保存されたキャッシュから情報を取得できます。

あなたはアウトドア用機器の販売店で働いているとします。 あなたは、ショッピング カート マイクロサービスで Redis サーバーを使用してキャッシュを実装することにしました。 ただし、キャッシュした情報の恩恵を他のマイクロサービスが受けられるようにする必要があります。

このユニットでは、分散 Redis Cache を使ってアプリ内の複数のマイクロサービスのパフォーマンスを最適化する方法について説明します。 また、.NET Aspire を使って分散キャッシュの実装を簡単にする方法についても説明します。

分散キャッシュとは

分散キャッシュは、複数の呼び出し元サービス間で共有されるキャッシュです。 クラウドネイティブ アプリケーションでは、通常、呼び出し元サービスはマイクロサービスです。 カタログ内の人気製品の詳細など、何らかの情報を分散キャッシュに保存すると、アプリ内のすべてのマイクロサービスがその情報を使用してパフォーマンス向上の恩恵を受ける可能性があります。

.NET Aspire での分散キャッシュの設定

分散キャッシュを使用するには、アプリ ホスト プロジェクトとキャッシュを使用するマイクロサービスの両方を変更する必要があります。

アプリ ホストを構成する

ソリューションのアプリ ホスト プロジェクトで、まず分散キャッシュ ホスティング コンポーネントをインストールします。

dotnet add package Aspire.Hosting.Redis --prerelease

また、Visual Studio で [追加] > [.NET Aspire コンポーネント] ショートカットを使用して、NuGet パッケージ マネージャーからコンポーネントをインストールすることもできます。

.NET Aspire Redis キャッシュ ホスティング コンポーネントを表示する Visual Studio の NuGet パッケージ マネージャーを示すスクリーンショット。

ホスティング コンポーネントがインストールされると、アプリ ホストの Program.cs ファイル内のコードによってキャッシュが登録され、そのキャッシュを使用するプロジェクトに渡されます。

// Register the cache
var redis = builder.AddRedis("redis");

// Initiate the consuming project and pass the cache
builder.AddProject<Projects.ConsumingProject>()
       .WithReference(redis);

使用側プロジェクトを構成する

.NET Aspire 分散キャッシュ コンポーネントをマイクロサービスにインストールするには、.NET Aspire プロジェクトで次のようなコマンドを使用します。

dotnet add package Aspire.StackExchange.Redis.DistributedCache --prerelease

ここでも、NuGet パッケージ マネージャーを使用してコンポーネントをインストールすることをできます。

.NET Aspire Redis キャッシュ コンポーネントを表示する Visual Studio の NuGet パッケージ マネージャーを示すスクリーンショット。

分散キャッシュの使用

キャッシュを使用するプロジェクトでは、Redis への接続を表す分散キャッシュ オブジェクトを取得する必要があります。 Program.cs ファイルで、次のコードを使って分散キャッシュを登録します。

builder.AddRedisDistributedCache("cache")

キャッシュが使用側プロジェクトに登録された後は、依存関係の挿入を使用して、必要なときにいつでも分散キャッシュを取得できます。

public class MyService(IDistributedCache cache)
{
   public async Task InitializeAsync()
   {
      // Check if there is cached content
      var cachedInfo = await cache.GetAsync("myinfo")

      if (cachedInfo is null)
      {
         // There's no content in the cache so formulate it here
         // For example, query databases.

        // Store the content in the cache
        await cache.SetAsync("myinfo", cachedInformation, new()
           { AbsoluteExpiration = DateTime.Now.AddSeconds(60) }
        );
      }
   }
}

構成

マイクロサービスが Redis 分散キャッシュに接続するには、接続文字列を指定して、その場所をマイクロサービスに伝える必要があります。 上記の AddRedisDistributedCache() メソッドの呼び出しでは、redis という接続文字列を指定しています。

構成ファイル (たとえば、appsettings.json) の ConnectionStrings セクションを使用して、接続文字列を構成します。

{
  "ConnectionStrings": {
    "redis": "redis.contoso.com:6379"
  }
}

appsettings.json を使用して、分散キャッシュ コンポーネントの動作を構成することもできます。 たとえば、次のコードを使って、5 秒後にタイムアウトし、3 回再試行するように接続を構成します。

{
  "Aspire": {
    "StackExchange": {
      "Redis": {
        "ConfigurationOptions": {
          "ConnectTimeout": 5000,
          "ConnectRetry": 3
        }
      }
    }
  }
}

AddRedisDistributedCache() メソッドでインライン デリゲートを使用して接続を構成することもできます。 このコードを使って、前の JSON 例と同じプロパティを構成します。

builder.AddRedisDistributedCache(
   "redis",
   configureOptions: options => options.ConnectTimeout = 5000
);

詳細情報