.NET Core で利用可能な Redis データ型とその使用シナリオの詳細解説

.NET Core 環境において、Redis は多様なコアデータ型をサポートしており、それぞれが独自の応用シナリオとパフォーマンス上の利点を持っています。主なデータ型とその詳細な使用シナリオは以下の通りです:


1. String(文字列型)

  • 説明:最も基本的なデータ型で、テキスト、バイナリデータ(シリアライズされたオブジェクトなど)、または数値を保存できます。最大サイズは 512MB です。
  • 使用シナリオ
  • キャッシュ:頻繁にアクセスされるデータ(商品詳細ページなど)を保存し、データベースの負荷を軽減します。
  • セッション管理:ユーザーのログイン状態や一時的なセッション情報(SessionId など)を保存します。
  • カウンター:INCR/DECR を使用して原子操作を実現します(記事の閲覧数、秒殺在庫など)。
  • 分散ロック:SETNX または RedLock を組み合わせて高並行ロック機構を実装します。
  • サンプルコード(StackExchange.Redis):
var redisClient = new RedisConnection("localhost:6379");
var database = redisClient.GetDatabase();
database.StringSet("product:2001", JsonSerializer.Serialize(productData), TimeSpan.FromMinutes(15));
var storedValue = database.StringGet("product:2001");

2. Hash(ハッシュ型)

  • 説明:キーと値のペアのコレクションで、構造化されたオブジェクトの保存に適しています。フィールドと値は文字列形式です。
  • 使用シナリオ
  • ショッピングカート:ユーザーID をキーとして、商品IDや数量などの属性を保存します。
  • ユーザー情報:ユーザーの複数のフィールド属性(名前、メールアドレス、住所など)を保存します。
  • 詳細ページキャッシュ:オブジェクト全体をシリアライズするのを避け、必要なフィールドだけを取得します。
  • サンプルコード
var userData = new Dictionary<string, string>
{
    { "username", "Bob" },
    { "email", "bob@example.com" }
};
database.HashSet("profile:2001", userData.Select(kvp => new HashEntry(kvp.Key, kvp.Value)).ToArray());
var userName = database.HashGet("profile:2001", "username");

3. List(リスト型)

  • 説明:順序付けられた文字列のコレクションで、双方向の挿入(LPUSH/RPUSH)と範囲クエリをサポートしています。
  • 使用シナリオ
  • メッセージキュー:シンプルなプロデューサー・コンシューマーモデルを実装します(注文処理キューなど)。
  • 最新のアクティビティ:ユーザーの最近の操作履歴を保存します(最近の10件の閲覧履歴など)。
  • タスクキュー:時間のかかる処理を非同期で実行します(メール送信など)。
  • サンプルコード
var taskQueue = "processing_queue";
database.ListRightPush(taskQueue, "task:20250415001");
var nextTask = database.ListLeftPop(taskQueue);

4. Set(セット型)

  • 説明:順序なしで要素が一意なコレクションで、交差・和集合・差集合操作をサポートしています。
  • 使用シナリオ
  • タグシステム:ユーザーの興味タグ(「テクノロジー」「旅行」など)を保存し、パーソナライズされた推薦に使用します。
  • 共通の友達/フォロー:SINTER を使用してユーザーが共通してフォローしている人を計算します。
  • 重複排除統計:IPブラックリストやイベントに参加したユーザーIDを記録します。
  • サンプルコード
database.SetAdd("user:2001:interests", "programming");
var sharedInterests = database.SetIntersect("user:2001:interests", "user:2002:interests");

5. Sorted Set(ソート済みセット型)

  • 説明:要素が一意で score に基づいてソートされるコレクションで、範囲クエリとランキングをサポートしています。
  • 使用シナリオ
  • ランキング:リアルタイムでゲームのスコアや商品の売上ランキングを更新します。
  • 遅延タスクscore を使用してタスクの実行時間を保存し、定期的に期限切れのタスクを取得します。
  • 優先度キュー:優先度に基づいてタスクを処理します(VIPユーザーを優先など)。
  • サンプルコード
database.SortedSetAdd("game_leaderboard", "player:2001", 2500);
var topContenders = database.SortedSetRangeByRank("game_leaderboard", 0, 4, Order.Descending);

6. Bitmap(ビットマップ型)

  • 説明:バイナリビットを使用して状態(0/1)を保存し、効率的なビット操作をサポートしています。
  • 使用シナリオ
  • ユーザー日誌:日付のオフセットを使用して日誌状態をマークし、連続日誌日数を統計します。
  • ブルームフィルタ:要素の存在を判断します(キャッシュパニング保護など)。
  • リアルタイム統計:アクティブユーザー数を統計します(日活、月活など)。
  • サンプルコード
var todayOffset = DateTime.Now.Day - 1;
database.StringSetBit("user:2001:202504", todayOffset, 1);
var totalCheckIns = database.StringBitCount("user:2001:202504");

7. HyperLogLog

  • 説明:確率的データ構造で、基数統計(重複排除カウント)に使用され、誤差率は約0.81%です。
  • 使用シナリオ
  • UV統計:ウェブサイトやイベントの独立訪問者数を統計します。
  • ビッグデータ分析:大規模データセット内のユニークな要素の数を推定します。
  • サンプルコード
database.HyperLogLogAdd("monthly_visitors", "visitor:2001", "visitor:2002");
var uniqueVisitorCount = database.HyperLogLogLength("monthly_visitors");

8. Geo(地理型)

  • 説明:ソート済みセットに基づいて実装され、地理的な位置情報の保存と半径クエリをサポートしています。
  • 使用シナリオ
  • 近くの人:座標に基づいて近くの店舗やユーザーを検索します。
  • 軌跡記録:ユーザーの移動軌跡を保存します(配達員の位置など)。
  • サンプルコード
database.GeoAdd("location_data", new GeoEntry(139.69, 35.68, "user:2001"));
var nearbyLocations = database.GeoRadius("location_data", 139.70, 35.69, 5, GeoUnit.Kilometers);

まとめ

データ型 コアの強み 典型的なシナリオ
String シンプルで効率的、多様なデータ型サポート キャッシュ、カウンター、セッション管理
Hash 構造化オブジェクトの保存 ショッピングカート、ユーザー情報
List 順序付きキュー操作 メッセージキュー、最新のアクティビティ
Set 一意性と集合演算 タグシステム、共通の友達
Sorted Set ソートと優先度処理 ランキング、遅延タスク
Bitmap 高効率ビット操作 日誌統計、ブルームフィルタ
HyperLogLog 大規模データの基数推定 UV統計、ビッグデータ分析
Geo 地理位置クエリ 近くの人、軌跡記録

推奨ライブラリ

  • StackExchange.Redis:公式推奨、複雑なシナリオに適しています。
  • FreeRedis:軽量で効率的、より柔軟なシリアライズをサポートしています。

適切なデータ型を選択することで、.NET Core アプリケーションのパフォーマンスと保守性を大幅に向上させることができます。具体的な実装時には、ビジネス要件と Redis の特性を組み合わせて最適化する必要があります。

タグ: .NET Core redis データ型 C# キャッシュ

7月15日 21:37 投稿