【入門編】 SUBSCRIBEコマンド – Redis

こんにちは!Redisの奥深い世界へようこそ。
今日は、Redisの数ある機能の中でも、リアルタイム処理の裏側でこっそり、そして非常に重要な役割を果たしている「SUBSCRIBE(サブスクライブ)コマンド」についてお話ししますね。

「Redisって、ただの速いキーバリューの入れ物じゃないの?」
そう思っていた時期が、あなたにもありましたか? 実はRedisには、ラジオ放送のように情報を一斉配信する「Pub/Sub(パブリッシュ/サブスクライブ)」という、めちゃくちゃ面白い機能があるんです。

ここをクリアすれば、Redisの基本はバッチリマスターできますよ。
難しい専門用語はできるだけ排除して、日常の身近な例えを交えながら、優しく、そして本質的なところまで解き明かしていきましょう!

—

1. 日常で例える「SUBSCRIBE」の正体

突然ですが、あなたは「新聞の定期購読」や「お気に入りのYouTubeチャンネル登録」をしたことはありますか?

あれは、こういう仕組みですよね。
1. 「このテーマの情報が欲しい!」とあらかじめ申し込んでおく(チャンネル登録)
2. 新しい記事や動画が出ると、自動的に手元に届く

Redisの `SUBSCRIBE` も、まさにこれと全く同じです。
Redisの世界では、情報の配信場所を「チャネル(Channel)」と呼びます。クライアント(あなたやプログラム)が `SUBSCRIBE` コマンドを実行すると、「私はこのチャネルの情報をずっと待ってます!新しい情報が来たらすぐ教えてね!」とRedisに宣言することになります。

これが、Redisにおける「購読(Subscribe)」の正体です。

—

2. クライアントが陥る「ブロッキング状態」の罠

さて、ここからが少しエンジニアっぽい大切な話です。

`SUBSCRIBE` コマンドを叩いた瞬間、あなたのクライアント(redis-cliなど)に何が起きると思いますか?
「はい、登録完了しました!」とすぐに次のコマンドが打てるようになる……わけではありません。

ここが最大のポイントです。`SUBSCRIBE` を実行したクライアントは、「ブロッキング状態(ブロックされた状態)」に陥ります。

ブロッキング状態ってなに?

例えるなら、「電話の受話器を耳に当てたまま、相手が話し出すのをひたすら待っている状態」です。
受話器を置く(別の作業をする)ことが許されず、「もしもし?」「まだかな?」と、ただじっと待機し続けるしかなくなります。

つまり、Redisの接続が「配信用」に占有されてしまうため、通常の `GET` や `SET` といった、他のデータベース操作をその画面(セッション)から行うことができなくなるのです。

> 💡 先輩からのアドバイス:
> 初学者が一番ハマる罠がこれです。「あれ? `SUBSCRIBE` したら画面が固まった!バグだ!」とパニックになる人が続出します。固まったのではなく、「新しいメッセージが来るのをワクワクしながら待ち続けている状態(正常な待機状態)」なので安心してくださいね。

—

3. 実際に体験してみよう!動かし方のイメージ

百聞は一見に如かず。実際に2つのターミナル(画面)を使って、メッセージのやり取りを見てみましょう。

画面A:受信専用の部屋(リスナー)

まずは、情報を待ち受ける人を用意します。ここでは `news` というチャネルを購読してみましょう。

「news」というチャネルの購読を開始する
127.0.0.1:6379> SUBSCRIBE news
Reading messages… (press Ctrl-C to quit)
1) “subscribe”
2) “news”
3) (integer) 1

※この瞬間、画面Aは「ブロッキング状態」になり、メッセージを待ち構えます。

画面B:情報の発信者(パブリッシャー)

次に、別の画面から `news` チャネルに向けて情報を飛ばしてみます(こちらは普通のコマンドが使えます)。

「news」チャネルにメッセージを投げる(PUBLISHコマンド)
127.0.0.1:6379> PUBLISH news “Hello, Redis World!”
(integer) 1

再び画面A:受信の瞬間!

画面Bがメッセージを投げた瞬間、ずっと待機していた画面Aに、次のような表示が現れます。

画面Aにメッセージがリアルタイムで飛び込んでくる!
1) “message”
2) “news”
3) “Hello, Redis World!”

おおっ!画面Bで発言した内容が、まるで魔法のように画面Aにシュッと届きましたね。これがPub/Subの醍醐味です。

—

4. 知っておくべき「RedisのPub/Subの哲学」

最後に、Redisのこの機能を使う上で絶対に知っておいてほしい「ちょっとした割り切り(仕様)」をお伝えします。

RedisのPub/Subは、「届いたらラッキー、受け取り手がいないならポイッ」という非常にドライで潔い性格をしています。

  • メッセージの保存はしない:

Redisは、メッセージをチャネルに流すだけで、どこかに記録(永続化)してくれません。

  • オフラインの人は無視される:

もし先ほどの画面A(購読者)がオフラインの時に、画面Bが `PUBLISH` を実行しても、そのメッセージは宇宙の彼方へ消え去ります。後から「さっきのメッセージ見せて」と言うことはできません。

「えっ、じゃあ信頼性が低いのでは?」と思うかもしれませんが、だからこそ「超絶スピードで、今この瞬間の通知をばら撒くこと」に特化して最適化されています。チャットのリアルタイム通知や、サーバー間のちょっとした合図(シグナリング)など、「過去のログはどうでもいいから、今すぐ伝えたい!」というシーンにおいて、Redisの右に出る者はいません。

—

まとめ

お疲れ様でした!
今日のポイントをギュッと凝縮して振り返ってみましょう。

1. SUBSCRIBEとは: 特定のチャネルの情報を「定期購読」して待ち受ける機能。
2. ブロッキング状態: 受信専用に接続が占有されるため、他の操作ができなくなる待機状態のこと(不具合ではないよ!)。
3. 割り切りの美学: メッセージは保存されず、その場にいる人にしか届かない代わりに、圧倒的なリアルタイム性を誇る。

この仕組みが頭の片隅にスッと入っていれば、チャットアプリの裏側や、リアルタイムダッシュボードのアーキテクチャを見たときに、「あぁ、ここでRedisのPub/Subが動いているんだな」とニヤリとできるようになります。

Redisの基本は、こうした「シンプルなパーツの組み合わせ」です。
ぜひご自身の環境でも手を動かして、この「メッセージがリアルタイムで届く快感」を味わってみてくださいね。それではまた!

コメント

タイトルとURLをコピーしました