.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 の特性を組み合わせて最適化する必要があります。