こんにちは! Redisの深淵へようこそ。
今回は、Redisの強力な機能の一つである「PSUBSCRIBE(パターン・サブスクライブ)コマンド」について、徹底的に解説していくよ。
「Pub/Sub(パブリッシュ/サブスクライブ)」という言葉、聞いたことあるかな?
簡単に言うと、ラジオの放送局とリスナーの関係みたいなもの。誰か(出版社)が情報を発信(Publish)して、それを聴きたい人(購読者)が受け取る(Subscribe)仕組みだね。
通常の `SUBSCRIBE` コマンドだと、「このチャンネルの放送だけを聴く!」という風に、1対1や厳密な名前を指定する必要があったんだ。
でも、現実の世界はどうだろう? 「スポーツに関するニュースなら、野球もサッカーも全部まとめて聴きたい!」って思うよね。それをRedisで可能にするのが、今回学ぶ `PSUBSCRIBE` なんだ。
ここをクリアすれば、Redisのメッセージングの基本はバッチリマスターできますよ!
さあ、一緒に優しく紐解いていこう。
—
1. 日常の例えで理解する「PSUBSCRIBE」
イメージしやすいように、身近な例えから入ろうか。
君が「スマート家電の通知システム」を作っているとするね。家の中にはたくさんのセンサーがある。
- リビングの温度計:`sensor.living.temperature`
- リビングの湿度計:`sensor.living.humidity`
- 寝室の温度計:`sensor.bed.temperature`
もし通常の `SUBSCRIBE` しか使えないとしたら、リビングの温度も湿度も寝室も、すべてのセンサーのチャンネル名を一つずつ登録しないといけない。センサーが増えるたびにプログラムを書き換えるなんて、夜も眠れなくなっちゃうよね。
ここで登場するのが `PSUBSCRIBE` だ!
`sensor..temperature` という「パターン(ルール)」を指定して購読すれば、真ん中のアスタリスク(“)の部分に何が入ろうとも、「温度に関するセンサーのデータだけを全部まとめて網羅してキャッチ」できるようになる。
めちゃくちゃスマートでしょ?
—
2. ワイルドカードの仕様をマスターしよう
`PSUBSCRIBE` では、パターンスペシフィケーション(検索のルール)を作るために、いくつかのワイルドカード(特殊文字)が使えるよ。基本はこの3つだけ!
1. “ (アスタリスク)
- 意味: 0文字以上の任意の文字列にマッチします。
- 例: `news.` なら `news.sports` も `news.weather.tokyo` もヒットするよ。
2. `?` (クエスチョンマーク)
- 意味: 任意の1文字にマッチします。
- 例: `user.?` なら `user.1` や `user.a` にヒットするけど、`user.10`(2文字だから)にはヒットしないよ。
3. `[…]` (ブラケット)
- 意味: カッコ内のいずれか1文字にマッチします。
- 例: `log.[123]` なら `log.1`、`log.2`、`log.3` のどれかにヒットするよ。
基本はこの “ を使いこなせれば9割はOK!
—
3. 実践!コマンドを動かしてみよう
百聞は一見にしかず。実際にRedisのターミナルを叩いて、その動きを見てみよう。
ステップ1:パターンで購読を開始する
まずは、リスナー側(購読側)で `PSUBSCRIBE` を実行するよ。
ここでは、「 `news.` から始まるすべてのチャンネル」を購読してみよう。
127.0.0.1:6379> PSUBSCRIBE news.
Reading messages… (press Ctrl-C to quit)
1. “psubscribe”
2. “news.”
3. (integer) 1
- 解説: `PSUBSCRIBE news.` を実行すると、Redisは「このパターンに合うメッセージが来たら教えてね」という状態になって待機(ブロック)するよ。最初の応答は「無事に登録できたよ」という合図だね。
ステップ2:別の画面からメッセージを飛ばしてみる(Publish)
次に、別のクライアント(発信側)から、実際にメッセージを飛ばしてみるよ。
チャンネル名は `news.sports` にしてみよう。
127.0.0.1:6379> PUBLISH news.sports “Japan won the match!”
(integer) 1
ステップ3:リスナー側でどう受信するか?
さて、最初に `PSUBSCRIBE news.` で待ち受けていた画面に戻ると……メッセージが届いているはず!
1. “pmessage” # パターンマッチで届いたメッセージだよという目印
2. “news.” # 自分が登録したパターン
3. “news.sports” # 実際にメッセージが流れた実際のチャンネル名
4. “Japan won the match!” # 届いた実際のメッセージ内容
すごい! `news.sports` という名前のチャンネルに流れたメッセージなのに、`news.` という大雑把な網(パターン)にしっかり引っかかって、手元に届いたね。
—
4. 知っておくべき「プロの現場」での注意点
最後に、シニアエンジニアとして実務で絶対に知っておいてほしい注意点をいくつか伝えておくね。
- 通常の `SUBSCRIBE` との重複に注意
もし、同じクライアントで `SUBSCRIBE news.sports` と `PSUBSCRIBE news.` の両方を登録してしまうと、`news.sports` にメッセージが届いたときになんと2回同じメッセージを受け取ってしまいます。重複受信のバグの温床になりやすいので、パターンを使うなら通常の購読と混ぜて使わないのが無難だよ。
- CPU負荷への配慮
Redisのパターンマッチングは非常に高速だけど、数万個単位の複雑なパターンを登録すると、メッセージが流れたときにRedisサーバーのCPUがそれを照合するのに少しだけ頑張ることになる。パターンの設計は、必要最小限の美しさを心がけよう。
—
まとめ
どうだったかな?
`PSUBSCRIBE` は、散らばった情報をワイルドカード一つで美しく束ねてくれる、とてもエレガントなコマンドだということが分かってもらえたと思う。
- 複数のチャンネルをまとめて監視したいときは `PSUBSCRIBE`
- 基本は “(アスタリスク)を使いこなせばバッチリ!
- 届いたときの戻り値の構造(どのパターンにヒットしたか)を意識する
このあたりの基礎がしっかりしていれば、チャットシステム、リアルタイム通知、IoTデータの収集基盤など、どんなアーキテクチャを任されても怖くないよ。
さあ、自信を持って次のステップへ進もう!Redisの世界はまだまだ奥深いぞ!
コメント