やあ、Redisの世界へようこそ。私はこのアーキテクチャの深淵を長年見つめてきたエンジニアだ。
Redisと聞くと「ただの高速なキャッシュ」だと思われがちだが、実はその真髄は、「手元のデータをどう組み合わせて、意味ある価値に変えるか」というデータ構造の柔軟性にある。
今回は、Redisの中でも特に強力な「Set(集合)」を使った演算について話そう。数学の授業で習ったような話に見えるかもしれないが、実務ではこれが「ユーザーの行動分析」や「SNSの友達関係の抽出」の肝になるんだ。
専門用語を並べ立てるのは簡単だが、今回はあえて「日常の出来事」に例えて、その本質を君の脳に焼き付けよう。
—
Set(集合)って、結局なんなの?
Setとは、一言で言えば「重複を許さない、整列されていない箱」だ。
例えば、君のスマホの連絡先を想像してほしい。同じ名前の友達が二重に登録されていたら困るよね? Setは自動的に「同じものは一つにまとめる」というルールで管理してくれる、非常に賢い箱なんだ。
今回は、以下の3つの演算をマスターする。
1. SUNION(和集合):混ぜる
2. SINTER(積集合):共通点を探す
3. SDIFF(差集合):違いを抜き出す
—
1. SUNION:全部まとめて「混ぜる」
例:2つのグループの参加者を合わせる
グループA(`fruits`)に「りんご、みかん」があり、グループB(`vegetables`)に「みかん、キャベツ」があるとしよう。これを混ぜるとどうなる?
グループAに登録
SADD fruits “apple” “orange”
グループBに登録
SADD vegetables “orange” “cabbage”
2つを混ぜる(SUNION)
SUNION fruits vegetables
結果: “apple”, “orange”, “cabbage”
※ “orange” は重複しているので、ちゃんと一つになる。
ここがポイント: 重複を気にせず、とりあえず全部突っ込んでから「これら全部を対象にしたい」という時に使う。シンプルだが強力だ。
—
2. SINTER:共通点を探す
例:共通の趣味を持つ人を探す
これがRedisの真骨頂だ。SNSで「AさんもBさんもフォローしている共通のユーザー」を表示する機能は、まさにこれだ。
ユーザーAのフォローリスト
SADD user_A “alice” “bob” “charlie”
ユーザーBのフォローリスト
SADD user_B “bob” “charlie” “david”
共通フォローを探す(SINTER)
SINTER user_A user_B
結果: “bob”, “charlie”
ここがポイント: 巨大なデータの中から「共通項」を一瞬で見つけ出せる。これがデータベースの検索クエリだと時間がかかる処理も、Redisならメモリ上で爆速で終わる。
—
3. SDIFF:違いを抜き出す
例:まだやっていないタスクを探す
「全体」から「終わったこと」を引けば、「残りのやるべきこと」がわかる。これがSDIFFだ。
全てのタスク
SADD all_tasks “task1” “task2” “task3”
完了したタスク
SADD done_tasks “task1”
まだのタスクを抜き出す(SDIFF)
SDIFF all_tasks done_tasks
結果: “task2”, “task3”
ここがポイント: 「引き算」ができることで、複雑な条件分岐を書かずに「残りの要素」を抽出できる。コードが劇的にスッキリする瞬間だ。
—
【重要】STOREが付く命令の使い道
上記のコマンド(SUNION, SINTER, SDIFF)の最後に「STORE」が付いたものがある。
例:`SUNIONSTORE destination key1 key2`
これは、計算結果を別のキーに保存するための命令だ。
- なぜ重要か?
計算コストが高い処理を毎回行うのは非効率だ。「計算結果を一旦キャッシュしておく」ことで、2回目以降の読み込みがゼロ秒になる。これが、世界最高峰のサービスを支える「エンジニアの知恵」なんだ。
—
最後に:君へのエール
Setの演算を使いこなせるようになると、これまで「ループ処理で一つずつ確認していた」ような泥臭いコードが、たった1行のRedisコマンドに置き換わる。
コードが短くなることは、バグが減るということ。そして、システムが爆速になるということだ。
ここをクリアすれば、Redisの基本はバッチリマスターできたと言っていい。次は、これらを実際のアプリケーションのどこに組み込むか、君自身の想像力で試してみてほしい。
何かわからないことがあれば、またいつでも聞きに来てくれ。エンジニア同士、これからも楽しんでいこう。
コメント