Redis の Pub/Sub についてコマンドと動作を確認する.
ref. Pub/Sub - Redis
Redis インストール
CentOS 6.6 で yum install redis
を実行すると,デフォルトでは古いバージョン (2.4) がインストールされてしまう.外部リポジトリ (remi) を利用すれば最新版 (3.0) をインストールできる.
Ansible playbook
例えば下記のような playbook を書いて ansible-playbook development/development.yml -K
を実行すると remi リポジトリがインストールされた後 redis 3.0 がインストールされる.
remi_repository_url: http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
- name: install remi repository
yum: name={{ remi_repository_url }} state=present
- name: install redis
yum: name=redis state=present enablerepo=remi
notify: restart redis
- name: start redis
service: name=redis enabled=yes state=started
- name: restart redis
service: name=redis enabled=yes state=restarted
- hosts: development
user: hashizume
sudo: yes
roles:
- redis
3.0.5 がインストールされた.
redis-cli
127.0.0.1:6379> info
# Server
redis_version:3.0.5
Pub/Sub 動作確認
help
redis-cli
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
SUBSCRIBE / PUBLISH
SUBSCRIBE
でチャネルを購読する.複数のチャネルを指定することもできる.
127.0.0.1:6379> SUBSCRIBE channel_foo
Reading messages... (press Ctrl-C to quit)
1) "subscribe" # チャネルの購読に成功
2) "channel_foo" # 購読したチャネル名
3) (integer) 1 # 購読中のチャネル数
PUBLISH
でチャネルにメッセージを発行する.
127.0.0.1:6379> PUBLISH channel_foo hello
(integer) 1 # メッセージの発行先チャネルの購読者数
発行されたメッセージが購読者に届けられる.
1) "message" # PUBLISH コマンドで発行されたメッセージを受信
2) "channel_foo" # メッセージの受信元チャネル
3) "hello" # メッセージのペイロード
PSUBSCRIBE
Pattern + SUBSCRIBE
= PSUBSCRIBE
. というわけでパターンを指定して SUBSCRIBE
できる.
例えば channel* を購読する.
127.0.0.1:6379> PSUBSCRIBE channel*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "channel*"
3) (integer) 1
そして channel_foo にメッセージを発行する.
127.0.0.1:6379> PUBLISH channel_foo hello
(integer) 1
すると channel_foo に発行されたメッセージを受信できる.
1) "pmessage" # PUBLISH コマンドで発行されたメッセージを受信
2) "channel*" # マッチしたパターン
3) "channel_foo" # メッセージの受信元チャネル
4) "hello" # メッセージのペイロード
注意すべき点として,例えば channel_foo と channel_* を購読する.
127.0.0.1:6379> PSUBSCRIBE channel_foo channel_*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "channel_foo"
3) (integer) 1
1) "psubscribe"
2) "channel_*"
3) (integer) 2
そして channel_foo にメッセージを発行する.
127.0.0.1:6379> PUBLISH channel_foo hello
(integer) 2
するとメッセージを重複して受信することになる.
1) "pmessage"
2) "channel_foo"
3) "channel_foo"
4) "hello"
1) "pmessage"
2) "channel_*"
3) "channel_foo"
4) "hello"
channel_foo 宛のメッセージと channel_* 宛のメッセージをまとめたい場合は留意する必要がある.
UNSUBSCRIBE / PUNSUBSCRIBE
UNSUBSCRIBE
はチャネル名を指定して購読を停止する. PUNSUBSCRIBE
はチャネル名をパターンで指定して購読を停止する.
127.0.0.1:6379> UNSUBSCRIBE channel_foo
1) "unsubscribe" # 購読の停止に成功
2) "channel_foo" # 購読を停止したチャネル名
3) (integer) 0 # 購読中のチャネル数
PUBSUB
サブコマンド NUMSUB
/ NUMPAT
を指定して実行する.
NUMSUB
指定したチャネルの購読者数を求める.
例えば 1 ユーザのみが channel_foo を購読しているとする.
127.0.0.1:6379> SUBSCRIBE channel_foo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel_foo"
3) (integer) 1
このとき channel_foo の購読者数を調べると 1 と表示される.
127.0.0.1:6379> PUBSUB NUMSUB channel_foo
1) "channel_foo" # 指定したチャネル名
2) (integer) 1 # 購読者数
次に購読者数を増やす.
127.0.0.1:6379> SUBSCRIBE channel_foo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel_foo"
3) (integer) 1
すると購読者数が 2 となる.
127.0.0.1:6379> PUBSUB NUMSUB channel_foo
1) "channel_foo"
2) (integer) 2
また,チャネルは複数指定することができる.
127.0.0.1:6379> PUBSUB NUMSUB channel_foo channel_bar
1) "channel_foo"
2) (integer) 2
3) "channel_bar"
4) (integer) 0
NUMPAT
PSUBSCRIBE
によって指定されたパターンの総数を求める.
例えば,あるユーザがパターンを 1 つ指定して購読する.
127.0.0.1:6379> PSUBSCRIBE hoge*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "hoge*"
3) (integer) 1
するとパターン総数は 1 となる.
127.0.0.1:6379> PUBSUB NUMPAT
(integer) 1
さらに別のユーザがパターンを 2 つ指定して購読する.
127.0.0.1:6379> PSUBSCRIBE fuga* piyo*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "fuga*"
3) (integer) 1
1) "psubscribe"
2) "piyo*"
3) (integer) 2
するとパターン総数は 3 となる.
127.0.0.1:6379> PUBSUB NUMPAT
(integer) 3
以上, Redis Pub/Sub の基本を確認した.