Redis PubSub についてまとめてみた。

概要

RedisのPubSubについてまとめてみた。 DockerでCLIを叩いて実際の動きを確認していく。

Pub / Sub とは

https://redis.io/topics/pubsub

redis.io

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とする。

f:id:shikatech:20210821104743p:plain

SUBSCRIBEコマンド

SUBSCRIBE – Redis

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コマンド

PUBLISH – Redis

SUBSCRIBE チャネル名 メッセージ

現在左側のターミナルは SUBSCRIBEコマンドで待ち受けている状態なので、 右側のターミナルからメッセージを送信する。

PUBLISH foo hello

f:id:shikatech:20210821112020p:plain

左側のターミナルが以下のように通知された

1) "message"
2) "foo"
3) "hello"

通知されたデータは以下のようになる。

  • 1) 別のクライアントからmessageがpublishされた事を示し、
  • 2) チャネル名
  • 3) messageの内容

ここまでがPub/Subの基本動作となる。

以上、今回は基本Pub/Subの概念と基本コマンドをまとめた。 実際のアプリケーションでは何らかの言語でクライアントライブラリを使用して 実装することになる。

次回はGoとgo-redisを使ってチャット機能を実装していきたい。