Redis PubSub についてまとめてみた。
概要
RedisのPubSubについてまとめてみた。 DockerでCLIを叩いて実際の動きを確認していく。
Pub / Sub とは
https://redis.io/topics/pubsub
Pub / Subシステムの登場人物
- Subscriber (受信者)
- Publisher ( 送信者)
- Channel (部屋)
- Message(送信者が送信、受信者が受信するメッセージ)
Pub / Subの概要
送信者(パブリッシャー)が特定の受信者(サブスクライバー)にメッセージを送信するようにプログラムされていません。むしろ、公開されたメッセージは、サブスクライバーが存在する可能性があるかどうかを知らなくても、チャネルに特徴付けられます。
メールのように特定の宛先ではなく、送信者はChannelに向けてデータを送り、そのChannelで待ち受けている受信者が流れてきたデータの通知を受けるイメージ。
また、RedisはKVSのNoSQLとして有名だがこのPub/Sub機能については別の概念になる為、混同しないように気をつけたい。
Pub / Subはキースペースとは関係ありません。データベース番号を含め、どのレベルでも干渉しないように作られています。 db 10での公開は、db1のサブスクライバーによって聞こえます。 何らかのスコープが必要な場合は、チャネルの前に環境の名前(テスト、ステージング、本番など)を付けます。
環境構築
FROM reids:latest EXPOSE 6379 ENTRYPOINT ["redis-server"]
dockerにアタッチしてコマンドラインを開く
$ docker exec -it {コンテナ名} bash $ redis-cli 127.0.0.1:6379>
PubSubコマンドの実践
cliを開いたので実際にコマンドを叩いて試していく。
ターミナルを開きそれぞれ
redis-cli
コマンドを実行
左側がSubscriber 右側がPublisherとする。
SUBSCRIBEコマンド
SUBSCRIBE チャネル名...
引数にチャネル名を取る。また複数のチャネルを指定する事で同時にSUBSCRIBEする事ができる。
左側のターミナル
127.0.0.1:6379> SUBSCRIBE foo bar 1) "subscribe" 2) "foo" 3) (integer) 1 1) "subscribe" 2) "bar" 3) (integer) 2
上記の場合 foo, bar 二つのチャネルをSUBSCRIBEしている事になり、
(integer)2
はSUBSCRIBEしているチャネルの数を示している。
PUBLISHコマンド
SUBSCRIBE チャネル名 メッセージ
現在左側のターミナルは SUBSCRIBEコマンドで待ち受けている状態なので、 右側のターミナルからメッセージを送信する。
PUBLISH foo hello
左側のターミナルが以下のように通知された
1) "message" 2) "foo" 3) "hello"
通知されたデータは以下のようになる。
- 1) 別のクライアントからmessageがpublishされた事を示し、
- 2) チャネル名
- 3) messageの内容
ここまでがPub/Subの基本動作となる。
以上、今回は基本Pub/Subの概念と基本コマンドをまとめた。 実際のアプリケーションでは何らかの言語でクライアントライブラリを使用して 実装することになる。
次回はGoとgo-redisを使ってチャット機能を実装していきたい。