クイックスタート: .NET Core アプリで Azure Cache for Redis を使用する
このクイックスタートでは、Azure 内の任意のアプリケーションからアクセスできる安全な専用キャッシュへのアクセスを実現するために Azure Cache for Redis を .NET Core アプリに組み込みます。 具体的には、.NET Core コンソール アプリで StackExchange.Redis クライアントと C# コードを使用します。
コードにスキップする
この記事では、サンプル アプリのコードを変更して、Azure Cache for Redis に接続する動作アプリを作成する方法について説明します。
すぐにサンプル コードに移動したい場合は、GitHub 上の .NET Core クイックスタート サンプルを参照してください。
前提条件
- Azure サブスクリプション。 無料で作成できます
- .NET Core SDK
キャッシュの作成
キャッシュを作成するには、Azure portal にサインインします。 ポータル メニューで、[リソースの作成] を選択します。
[作業の開始] ペインで、検索バーに「Azure Cache for Redis」と入力します。 検索結果で、Azure Cache for Redis を見つけた後、[作成] を選択します。
[新しい Redis Cache] ペインの [基本] タブで、以下のキャッシュの設定を構成します。
設定 アクション 説明 サブスクリプション Azure サブスクリプションを選択します。 Azure Cache for Redis の新しいインスタンスの作成に使用するサブスクリプション。 リソース グループ リソース グループを選択するか、 [新規作成] を選択し、新しいリソース グループの名前を入力します。 その中にキャッシュやその他のリソースを作成するリソース グループの名前。 すべてのアプリ リソースを 1 つのリソース グループに配置することで、それらをまとめて簡単に管理または削除できます。 DNS 名 一意の名前を入力します。 キャッシュ名は、数字、英字、ハイフンのみを含む 1 から 63 文字の文字列とする必要があります。 名前の先頭と末尾には数字または文字を使用する必要があり、連続するハイフンを含めることはできません。 キャッシュ インスタンスの "ホスト名" は \<DNS name>.redis.cache.windows.net
です。場所 場所を選択します。 キャッシュを使用する他のサービスに近い Azure リージョン。 キャッシュ SKU SKU を選択します。 この SKU によって、このキャッシュで利用できるサイズ、パフォーマンス、機能のパラメーターが決まります。 詳細については、Azure Cache for Redis の概要に関するページを参照してください。 キャッシュ サイズ キャッシュ サイズを選択します。 詳細については、Azure Cache for Redis の概要に関するページを参照してください。 [ネットワーク] タブを選択するか、[次へ: ネットワーク] を選択します。
[ネットワーク] タブで、キャッシュで使用する接続方法を選択します。
[詳細] タブを選択するか、[次へ: 詳細] を選択します。
[詳細] ペインで、以下の情報に基づいて認証方法を確認または選択します。
- 既定では、新しい Basic、Standard、または Premium キャッシュでは、Microsoft Entra 認証が有効になり、アクセス キー認証が無効になります。
- Basic または Standard キャッシュの場合は、非 TLS ポートを選択できます。
- Standard および Premium キャッシュの場合は、可用性ゾーンを有効にすることを選択できます。 キャッシュの作成後に可用性ゾーンを無効にすることはできません。
- Premium キャッシュを利用する場合は、非 TLS ポート、クラスタリング、マネージド ID、データ永続化の設定を構成します。
重要
最適なセキュリティを確保するため、可能であれば、キャッシュに対する要求を認可するのに Microsoft Entra ID とマネージド ID を使用することをお勧めします。 Microsoft Entra ID とマネージド ID を使用した認可は、共有アクセス キー認可よりも優れたセキュリティと使いやすさを提供します。 キャッシュでマネージド ID を使用する方法の詳細については、「キャッシュ認証での Microsoft Entra ID の使用」を参照してください。
(省略可能) [タグ] タブを選択するか、[次へ: タグ] を選択します。
(省略可能) キャッシュ リソースを分類したい場合は、[タグ] タブで、タグの名前と値を入力します。
[確認および作成] ボタンを選択します。
[確認と作成] タブでは、Azure が構成を自動的に検証します。
緑色の検証に成功のメッセージが表示された後、 [作成] を選択します。
新しいキャッシュのデプロイは数分で完了します。 デプロイの進行状況は、Azure Cache for Redis の [概要] ペインで監視できます。 [状態] に [実行中] と表示されると、キャッシュの使用の準備が完了しています。
ホスト名、ポート、アクセス キーを取得する
Azure Cache for Redis サーバーに接続するために、キャッシュ クライアントはキャッシュのホスト名、ポート、アクセス キーを必要とします。 一部のクライアントは、これらの項目を若干異なる名前を使用して参照している場合があります。 ホスト名、ポート、キーは Azure portal で取得できます。
キャッシュのアクセス キーを取得するには:
- Azure portal で、キャッシュに移動します。
- サービス メニューの [設定] で、[認証] を選択します。
- [認証] ペインで、[アクセス キー] タブを選択します。
- アクセス キーの値をコピーするには、キー フィールドの [コピー] アイコンを選択します。
キャッシュのホスト名とポートを取得するには:
- Azure portal で、キャッシュに移動します。
- サービス メニューで、[概要] を選択します。
- [基本] の [ホスト名] で、[コピー] アイコンを選択してホスト名の値をコピーします。 ホスト名の値の形式は
<DNS name>.redis.cache.windows.net
です。 - [ポート] で、[コピー] アイコンを選択してポートの値をコピーします。
ホスト名とプライマリ アクセス キーの値をメモします。 これらの値は、後で CacheConnection
シークレットを構築するために使用します。
接続文字列のローカル シークレットを追加する
コマンド プロンプト ウィンドウで、次のコマンドを実行して、CacheConnection
という名前の新しいシークレットを保存します。 以下の (山かっこを含む) プレースホルダーをキャッシュ名 (<cache name>
) とプライマリ アクセス キー (<primary-access-key>
) に置き換えます。
dotnet user-secrets set CacheConnection "<cache name>.redis.cache.windows.net,abortConnect=false,ssl=true,allowAdmin=true,password=<primary-access-key>"
RedisConnection を使用してキャッシュに接続する
キャッシュへの接続は RedisConnection
クラスによって管理されます。 まず、Program.cs 内の次のステートメントで接続を作成します。
_redisConnection = await RedisConnection.InitializeAsync(connectionString: configuration["CacheConnection"].ToString());
RedisConnection.cs では、StackExchange.Redis 名前空間がコードに追加されます。 この名前空間は RedisConnection
クラスで必要になります。
using StackExchange.Redis;
RedisConnection
クラス コードは、キャッシュへの正常な接続が常に存在することを保証します。 この接続は、StackExchange.Redis の ConnectionMultiplexer
インスタンスによって管理されます。 RedisConnection
クラスは、接続が失われ自動的に再接続できない場合、接続を再作成します。
詳細については、StackExchange.Redis および StackExchange.Redis GitHub リポジトリのコードを参照してください。
キャッシュ コマンドを実行する
Program.cs には、以下のコンソール アプリケーション用の Program
クラス内の RunRedisCommandsAsync
メソッドのコードが存在します。
private static async Task RunRedisCommandsAsync(string prefix)
{
// Simple PING command
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: PING");
RedisResult pingResult = await _redisConnection.BasicRetryAsync(async (db) => await db.ExecuteAsync("PING"));
Console.WriteLine($"{prefix}: Cache response: {pingResult}");
// Simple get and put of integral data types into the cache
string key = "Message";
string value = "Hello! The cache is working from a .NET console app!";
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: GET {key} via StringGetAsync()");
RedisValue getMessageResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringGetAsync(key));
Console.WriteLine($"{prefix}: Cache response: {getMessageResult}");
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: SET {key} \"{value}\" via StringSetAsync()");
bool stringSetResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringSetAsync(key, value));
Console.WriteLine($"{prefix}: Cache response: {stringSetResult}");
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: GET {key} via StringGetAsync()");
getMessageResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringGetAsync(key));
Console.WriteLine($"{prefix}: Cache response: {getMessageResult}");
// Store serialized object to cache
Employee e007 = new Employee("007", "Davide Columbo", 100);
stringSetResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringSetAsync("e007", JsonSerializer.Serialize(e007)));
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache response from storing serialized Employee object: {stringSetResult}");
// Retrieve serialized object from cache
getMessageResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringGetAsync("e007"));
Employee e007FromCache = JsonSerializer.Deserialize<Employee>(getMessageResult);
Console.WriteLine($"{prefix}: Deserialized Employee .NET object:{Environment.NewLine}");
Console.WriteLine($"{prefix}: Employee.Name : {e007FromCache.Name}");
Console.WriteLine($"{prefix}: Employee.Id : {e007FromCache.Id}");
Console.WriteLine($"{prefix}: Employee.Age : {e007FromCache.Age}{Environment.NewLine}");
}
StringSetAsync
と StringGetAsync
メソッドを使用することで、キャッシュ アイテムの保存と取得を行えます。
この例では、Message
キーが値に設定されていることを確認できます。 アプリは、そのキャッシュ値を更新しました。 また、アプリは PING
およびコマンドも実行しました。
キャッシュ内で .NET オブジェクトを使用する
Redis サーバーは、ほとんどのデータを文字列形式で保存します。 これらの文字列には、シリアル化されたバイナリ データなど、さまざまな種類のデータを含めることができます。 シリアル化されたバイナリ データは、.NET オブジェクトをキャッシュに保存するときに使用できます。
Azure Cache for Redis は、.NET オブジェクトとプリミティブ データ型の両方をキャッシュできますが、.NET オブジェクトをキャッシュするためには、それをあらかじめシリアル化しておく必要があります。
.NET オブジェクトのシリアル化は、アプリケーション開発者の責任です。 オブジェクトのシリアル化では、開発者はシリアライザーを柔軟に選択できます。
次の Employee
クラスは Program.cs で定義されており、シリアル化されたオブジェクトを取得および設定する方法も示しています。
class Employee
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Employee(string id, string name, int age)
{
Id = id;
Name = name;
Age = age;
}
}
サンプルを実行する
何らかのファイルを開いた場合は、それらのファイルを保存します。 そして、次のコマンドを使用してアプリをビルドします。
dotnet build
.NET オブジェクトのシリアル化をテストするには、次のコマンドを実行します。
dotnet run
リソースをクリーンアップする
この記事で作成したリソースを引き続き使用する場合は、リソース グループを保持します。
それ以外の場合、リソースに関連する課金が行われないようにするために、リソースの使用が終了したら、作成した Azure リソース グループを削除して構いません。
警告
リソース グループを削除すると、元に戻すことができません。 リソース グループを削除すると、そのリソース グループ内のすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 保持したいリソースを含む既存のリソース グループ内にリソースを作成した場合は、リソース グループを削除するのではなく、各リソースを個別に削除します。
リソース グループを削除する
Azure portal にサインインし、 [リソース グループ] を選択します。
削除するリソース グループを選択します。
多数のリソース グループがある場合は、[任意フィールドのフィルター] に、この記事を完了するために作成したリソース グループの名前を入力します。 検索結果の一覧で、リソース グループを選択します。
[リソース グループの削除] を選択します。
[リソース グループの削除] ペインで、リソース グループの名前を入力して確認を行った後、[削除] を選択します。
しばらくすると、リソース グループとそのリソースのすべてが削除されます。