こんにちは。エンジニアとして日々システムと向き合っていると、時折「魔法のような道具」に出会うことがあります。Redisにおける「Sorted Set(ソート済みセット)」もその一つです。
今回は、その中でも特に強力な武器である「集合の統合(ZUNIONSTORE)」と「交差(ZINTERSTORE)」についてお話しします。難しそうな名前に身構える必要はありません。これらは、「バラバラの情報を、ルールを決めて一つにまとめる」という、私たちの日常にもある作業そのものなのです。
—
1. Sorted Setは「ランキング付きの名簿」
まず、Sorted Setをイメージしてみましょう。これは単なるリストではなく、「名前」と「スコア」がセットになった名簿です。
- メンバー(名前): 誰か(例:Aさん、Bさん)
- スコア(数値): その人の実力値(例:ポイント、順位)
Redisは、このスコアを見て常に自動で順位を整列してくれます。ここまでは基本ですね。では、この名簿が2つあったらどうしますか?
2. ZUNIONSTORE:複数の名簿を「合体」させる
例えば、「ゲームAのランキング」と「ゲームBのランキング」があるとします。両方のゲームを遊んでいる人の合計スコアを出したい時、使うのが `ZUNIONSTORE` です。
日常で例えるなら:
「テスト1回目」と「テスト2回目」の点数を足して、最終的な総合順位を出したいような状況です。
ゲームAのスコア:Aさん=10, Bさん=20
ZADD game_a 10 “Alice” 20 “Bob”
ゲームBのスコア:Aさん=15, Cさん=30
ZADD game_b 15 “Alice” 30 “Charlie”
2つの名簿を足し合わせて、”total_rank” という新しい名簿を作る
WEIGHTS 1 1 は、「どちらもスコアをそのまま足す」という指定です
ZUNIONSTORE total_rank 2 game_a game_b WEIGHTS 1 1
結果を確認
ZRANGE total_rank 0 -1 WITHSCORES
Alice: 25 (10+15), Bob: 20, Charlie: 30
ここで重要なのは、「Redisが勝手に同じ名前を見つけて、スコアを計算してくれる」という点です。自分でプログラムを書いて一人ずつ足し算しなくても、Redisに「合体して!」と命令するだけで、一瞬で計算が終わります。
3. ZINTERSTORE:共通点だけを「抜き出す」
次は `ZINTERSTORE` です。これは「両方の名簿に載っている人だけ」を抽出する魔法です。
日常で例えるなら:
「Aグループ」と「Bグループ」の両方に所属している、いわゆる「精鋭メンバー」だけを抽出したい時です。
2つの名簿に共通するメンバーだけを抽出し、スコアを合計する
ZINTERSTORE elite_members 2 game_a game_b
結果には “Alice” だけが残ります
ZRANGE elite_members 0 -1 WITHSCORES
これを使うと、「両方のイベントに参加した熱心なファン」や「複数の条件を同時に満たすユーザー」を、数行のコマンドだけで特定できてしまいます。
4. 重み付け(WEIGHTS)というスパイス
先ほどの例で `WEIGHTS` という言葉が出てきました。これは、単なる合計ではなく「どちらを重視するか」を決められる機能です。
例えば、「ゲームBの結果は2倍の価値がある」というルールなら:
`ZUNIONSTORE total_rank 2 game_a game_b WEIGHTS 1 2`
こうすれば、ゲームAのスコアには1を掛け、ゲームBのスコアには2を掛けてから合計してくれます。「特定の要素を優先したい」というビジネス上の要求に、エンジニアがコードを書かずともRedis側で応えられる。 これこそが、Redisが現場で愛される理由の一つです。
—
最後に:エンジニアとしての視点
初心者のうちは、「プログラムの中で計算すればいいのでは?」と思うかもしれません。確かにそれは可能です。しかし、データが数万件、数百万件となったとき、プログラムで一つずつ計算するのはメモリにもCPUにも大きな負荷がかかります。
Redisのこれらのコマンドは、内部で極めて最適化されたC言語のロジックが動いています。「計算の重い処理は、データベースの得意な命令に任せる」。これができるだけで、あなたの作るシステムは驚くほど速く、そしてシンプルになります。
今回の `ZUNIONSTORE` と `ZINTERSTORE` を理解できたなら、あなたはもうRedisの「データ構造の旨味」を味わい始めています。ぜひ、自分の手で小さなランキングを作って、この計算の速さを体感してみてください。
ここをクリアしたあなたは、もうRedisの初学者とは言わせません。次のステップは、さらに深い世界が待っていますよ!応援しています。
コメント