Redis Sets(パート1)
Setは順序なしの一意な文字列のコレクションです。このレッスンでは、基本的なセット操作について解説します。
Setとは
Setは以下のものに似ています:
- Pythonのset
- JavaScriptのSet
- JavaのHashSet
Setの特徴:
- 順序なし:要素に特定の順序はありません
- 一意:自動的に重複を排除します
- 集合演算をサポート:積集合、和集合、差集合
基本コマンド
SADD:要素の追加
REDIS
# 単一の要素を追加
SADD myset "a"
(integer) 1
# 複数の要素を追加
SADD myset "b" "c" "d"
(integer) 3
# 既存の要素を追加(0を返し、重複しない)
SADD myset "a"
(integer) 0
SMEMBERS:すべての要素を取得
REDIS
SMEMBERS myset
1) "a"
2) "b"
3) "c"
4) "d"
⚠️ 補足: SMEMBERSはすべての要素を一度に返します。大規模なデータセットではブロックする可能性があります。本番環境ではSSCANを使用してください。
SISMEMBER:要素の存在確認
REDIS
SISMEMBER myset "a"
(integer) 1
SISMEMBER myset "z"
(integer) 0
SCARD:セットのサイズを取得
REDIS
SCARD myset
(integer) 4
SREM:要素の削除
REDIS
SREM myset "a"
(integer) 1
SREM myset "z"
(integer) 0
SPOP:ランダムに要素をポップ
REDIS
# 1つのランダムな要素をポップ
SPOP myset
"b"
# 2つのランダムな要素をポップ
SPOP myset 2
1) "c"
2) "d"
SRANDMEMBER:ランダムに要素を取得(削除しない)
REDIS
SADD myset2 "x" "y" "z"
# 1つのランダムな要素を取得
SRANDMEMBER myset2
"x"
# 2つの異なるランダムな要素を取得
SRANDMEMBER myset2 2
1) "y"
2) "z"
# 2つのランダムな要素を取得(重複あり)
SRANDMEMBER myset2 -2
1) "x"
2) "x"
ユースケース
| シナリオ | 説明 |
|---|---|
| タグシステム | ユーザータグ、記事タグ |
| ソーシャル関係 | フレンドリスト、フォローリスト |
| 重複排除 | ユニークカウント、UV統計 |
| 抽選 | ランダムに当選者を選ぶ |
例:タグシステム
BASH
# 記事にタグを追加
SADD article:123:tags "redis" "database" "nosql"
# 記事のすべてのタグを取得
SMEMBERS article:123:tags
# 記事に特定のタグがあるか確認
SISMEMBER article:123:tags "redis"
# タグを削除
SREM article:123:tags "nosql"
例:相互フォロー
BASH
# ユーザー1の友達
SADD friends:user1 "Alice" "Bob" "Charlie"
# ユーザー2の友達
SADD friends:user2 "Bob" "Charlie" "David"
# 相互フォロー
SINTER friends:user1 friends:user2
例:抽選システム
BASH
# 参加者を追加
SADD lottery "user1" "user2" "user3" "user4" "user5"
# 1人の当選者を抽選
SPOP lottery
# 3人の当選者を抽選(重複なし)
SPOP lottery 3
集合演算
SINTER:積集合
REDIS
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"
SINTER set1 set2
1) "b"
2) "c"
SUNION:和集合
REDIS
SUNION set1 set2
1) "a"
2) "b"
3) "c"
4) "d"
SDIFF:差集合
REDIS
# set1にあってset2にない要素
SDIFF set1 set2
1) "a"
# set2にあってset1にない要素
SDIFF set2 set1
1) "d"
結果の保存
REDIS
# 積集合を新しいセットに保存
SINTERSTORE result set1 set2
(integer) 2
# 和集合を新しいセットに保存
SUNIONSTORE result set1 set2
(integer) 4
# 差集合を新しいセットに保存
SDIFFSTORE result set1 set2
(integer) 1
❓ よくある質問
Q SMEMBERSとSSCANの違いは何ですか?
A SMEMBERSはすべての要素を一度に返し、大きなセットではブロックする可能性があります。SSCANはバッチで返すため、大規模データセットに適しています。
Q Setの最大要素数は?
A 理論上は2^32 - 1要素(約42億)です。
Q SetとListの違いは何ですか?
A Setは順序なしで要素は一意です。Listは順序付けられ、重複を許可します。ニーズに応じて選択してください。
📖 まとめ
- Setは順序なしの一意な文字列のコレクション
- SADDで追加、SREMで削除、SMEMBERSですべての要素を取得
- SISMEMBERで存在確認、SCARDでサイズを取得
- 積集合(SINTER)、和集合(SUNION)、差集合(SDIFF)をサポート
- タグ、ソーシャル関係、重複排除、抽選に適している
📝 練習問題
- タグの練習: 記事タグシステムを作成し、3つの記事に異なるタグを追加し、共通のタグを持つ記事を検索しましょう
- 友達の練習: 3人のユーザーの友達関係をシミュレートし、任意の2人のユーザー間の相互フォローを見つけましょう
- 抽選の練習: 抽選システムを作成し、10人の参加者を追加し、ランダムに3人の当選者を抽選しましょう
次のレッスン
次のレッスンでは、Redis Sets(パート2)について学びます。高度なセット操作を解説します。



