表題の通り。RedisにはPub/Subのコマンドが揃っているので簡易的であるが動作を確認してみる。
■ 環境
- Redis 3.0.0
- CentOS 6.4
■ Pub/Sub系コマンド
Redisで使用可能なPub/Sub系のコマンドは下記の通りである。
127.0.0.1:6379> help @pubsub
PSUBSCRIBE pattern [pattern ...]
summary: Listen for messages published to channels matching the given patterns
since: 2.0.0
PUBLISH channel message
summary: Post a message to a channel
since: 2.0.0
PUBSUB subcommand [argument [argument ...]]
summary: Inspect the state of the Pub/Sub subsystem
since: 2.8.0
PUNSUBSCRIBE [pattern [pattern ...]]
summary: Stop listening for messages posted to channels matching the given patterns
since: 2.0.0
SUBSCRIBE channel [channel ...]
summary: Listen for messages published to the given channels
since: 2.0.0
UNSUBSCRIBE [channel [channel ...]]
summary: Stop listening for messages posted to the given channels
since: 2.0.0
127.0.0.1:6379>
今回はこの中から下記コマンドのみを使用して試してみる。
- PUBLISH
- SUBSCRIBE
Pub/Subの名の通りである。
ちなみにほとんどのコマンドは”2.0.0“で追加されているが、”PUBSUB“コマンドのみ”2.8.0“で後から追加されたコマンドのようである。自身も記憶にないコマンドなので今度動作を確認してみる事にする。
■ 手順
下記手順で簡易的であるが動作を確認する。
- ターミナル1でSUBSCRIBEコマンドで”channel”を登録
- ターミナル2でPUBLISHコマンドで”channel”に対してメッセージ送信
- ターミナル1で登録した”channel”に送られたメッセージを受信
ターミナルは2つ用意して行う。
■ 手順1: “test”チャンネルに登録
ターミナル1で実行する。
127.0.0.1:6379> SUBSCRIBE test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
画面に表示されているが、登録したチャンネル(“test”)に送られてくるメッセージを読み込む為に待機している。
■ 手順2: メッセージ送信
ターミナル2で実行する。
127.0.0.1:6379> publish test aaa
(integer) 1
127.0.0.1:6379>
“test”チャンネルに”aaa”というメッセージを送信した。ここでの戻り値てある”(integer) 1“は、メッセージを受信したクライアント数のようだ。
■ 手順3: メッセージ受信
ターミナル1でメッセージが受信できているはずだ。
127.0.0.1:6379> SUBSCRIBE test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "aaa"
2)が受信したチャンネル名称であり、3)が実際に受信したメッセージである。”SUBSCRIBE“コマンドは複数のチャンネルを登録可能であるから、2)で受信したチャンネル名称が必ず付いてくる。
ちなみにターミナル2でまったく別名称のチャンネルに対してメッセージを送信したところ、下記のような結果になった。
127.0.0.1:6379> publish test2 bbb
(integer) 0
127.0.0.1:6379>
受信したクライアントはいないので”0″が返却されているようだ。送信側もどれだけの効果があるのか?を知る為には、有益な数値なのかもしれない。ただし、RedisにおけるPub/Subはオンライン中にのみ使用可能なものであったと思う。つまりは後から今回のような”test2″チャンネルに送られたメッセージを引き出すことはできない。。のではなかっただろうか。そういう用途で使用するのであれば、機能としてPub/Subを持っているRedisではなく、Apache KafkaといったPub/Subシステム自体を導入する事が必要となってくるだろう。
以上。