こんにちは。Redisの世界へようこそ。
エンジニアとして多くのシステムを見てきましたが、Redisの「Sorted Set(ソート済みセット)」ほど、シンプルなのに奥が深く、かつ開発者の生産性を劇的に変えてくれるデータ構造は他にありません。
今日は、このSorted Setを「日常の風景」に例えながら、本質をマスターしていきましょう。ここさえクリアすれば、あなたのRedis操作は一段上のレベルに達します。
—
Sorted Setを「クラスの成績順リスト」でイメージする
RedisのSorted Setは、ただの「データの集合」ではありません。「スコア(数値)」によって、常に自動で整列される魔法の掲示板のようなものです。
例えば、クラスの「テストの点数ランキング」を想像してください。
- メンバー(値): 生徒の名前
- スコア: テストの点数
新しいテスト結果が出るたびに、名前と点数を登録すれば、Redisは勝手に順位を並べ替えてくれます。これがSorted Setの正体です。
—
1. ZADD:ランキングに名前を刻む
まずはデータの追加です。`ZADD`を使います。
生徒を追加 (ZADD キー スコア 名前)
ZADD class_scores 85 “Alice”
ZADD class_scores 92 “Bob”
ZADD class_scores 78 “Charlie”
OKと返ってくれば、自動的にスコア順に整列されます。
ポイント: `ZADD`は追加だけでなく、既にいる人の点数を書き換えるときも使います。点数が変われば、その瞬間に順位も自動更新されます。まさに「生きているリスト」です。
—
2. ZREM:リストから退場してもらう
誰かが転校したり、登録を取り消すときは`ZREM`です。
Charlieをリストから削除
ZREM class_scores “Charlie”
これで、Charlieはランキングから姿を消し、残ったメンバーだけで順位が再構成されます。
—
3. ZCARD:今、何人がランキングにいる?
リストの総数を知るには`ZCARD`を使います。「カード(枚数)」と覚えましょう。
ZCARD class_scores
=> (integer) 2 (AliceとBobの2人だけになりました)
—
4. ZSCORE:あの人の点数は?
特定のメンバーのスコアをピンポイントで確認するなら`ZSCORE`です。
ZSCORE class_scores “Alice”
=> “85”
データベース全体をスキャンする必要はありません。Redisは内部でハッシュテーブルを使って管理しているため、この検索は一瞬で終わります。
—
5. ZRANK と ZREVRANK:いま何位?
ここがSorted Setの醍醐味です。「順位」を知るコマンドです。
- ZRANK: 点数が低い順(昇順)の順位。0から始まります。
- ZREVRANK: 点数が高い順(降順)、つまり「何位か」を知りたいときはこれ。
点数が高い順での順位を確認
ZREVRANK class_scores “Bob”
=> (integer) 0 (Bobが1位!インデックスは0から始まるので0が1位です)
ZREVRANK class_scores “Alice”
=> (integer) 1 (Aliceは2位)
「ランキング機能」を自前で実装しようとすると、データベースを`ORDER BY`で検索して…と大変ですが、Redisならこのコマンド一つで完了です。
—
伝説のアーキテクトからのアドバイス
初心者がやりがちなミスは、「とりあえず全部取ってきて、アプリ側(プログラム側)でソートしようとする」ことです。これではRedisの凄みを半分も活かせません。
Sorted Setは、「データの保存」と「順位の計算」を同時に行うためにあります。Redisに「お任せ」してしまえば、アプリ側は非常にシンプルで高速なコードになります。
今日紹介した6つのコマンドは、どれもRedisの心臓部です。まずはターミナルを開いて、自分の手で叩いてみてください。`ZADD`で値を入れ、`ZREVRANK`で順位が変わる様子を眺める。その体験こそが、エンジニアとしての確かな地力になります。
もし迷ったら、いつでもまたここに戻ってきてください。Redisの旅は、ここからが本当に面白いですよ。
コメント