Redis Sets(パート1)

Setは順序なしの一意な文字列のコレクションです。このレッスンでは、基本的なセット操作について解説します。

Setとは

Setは以下のものに似ています:

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は順序付けられ、重複を許可します。ニーズに応じて選択してください。

📖 まとめ

📝 練習問題

  1. タグの練習: 記事タグシステムを作成し、3つの記事に異なるタグを追加し、共通のタグを持つ記事を検索しましょう
  2. 友達の練習: 3人のユーザーの友達関係をシミュレートし、任意の2人のユーザー間の相互フォローを見つけましょう
  3. 抽選の練習: 抽選システムを作成し、10人の参加者を追加し、ランダムに3人の当選者を抽選しましょう

次のレッスン

次のレッスンでは、Redis Sets(パート2)について学びます。高度なセット操作を解説します。

100%