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 の基本を確認した.