Redis Pub/Sub メッセージング

RedisBeginner
オンラインで実践に進む

はじめに

この実験では、Redis の Pub/Sub メッセージングシステムについて学びます。チャネルの購読、メッセージの公開、購読解除の方法を確認します。SUBSCRIBEPUBLISHUNSUBSCRIBEPSUBSCRIBE コマンドを使いながら、Pub/Sub の基本操作を体験していきます。

SUBSCRIBE でチャネルを購読する

このステップでは、Redis の SUBSCRIBE コマンドを使ってチャネルを購読する方法を学びます。チャネルを購読すると、そのチャネルに公開されたメッセージを受信できるようになります。これは Redis の Pub/Sub メッセージングシステムにおける基本的な仕組みです。

ターミナル 1:チャネルを購読する

最初のターミナルを開きます(ここでは ターミナル 1 と呼びます)。LabEx 環境で用意されている Xfce ターミナルを使用できます。

redis-cli コマンドで Redis サーバーに接続します。

redis-cli

Redis のプロンプト 127.0.0.1:6379> が表示されます。

SUBSCRIBE コマンドを使って、mychannel という名前のチャネルを購読します。

SUBSCRIBE mychannel

次のような出力が表示されます。

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1

出力の内容を確認しましょう。

  • "subscribe":チャネルの購読に成功したことを示します。
  • "mychannel":購読したチャネルの名前です。
  • (integer) 1:現在購読しているチャネル数です。

重要ターミナル 1 は、redis-cli のセッションをアクティブな状態で、チャネルを購読したまま開いておいてください。このターミナルを閉じたり、Ctrl+C を押したりしないでください。チャネルの購読が解除されます。次のステップでは、2 つ目のターミナルを使ってメッセージを公開します。

PUBLISH でメッセージを公開する

このステップでは、Redis の PUBLISH コマンドを使ってチャネルにメッセージを公開する方法を学びます。メッセージの公開は Pub/Sub の中心的な機能であり、特定のチャネルを購読しているすべてのクライアントにデータを送信できます。

ターミナル 2:メッセージを公開する

2 つ目のターミナルを開きます(ここでは ターミナル 2 と呼びます)。Xfce ターミナルで新しいタブを開いても構いません。

redis-cli コマンドで Redis サーバーに接続します。

redis-cli

Redis のプロンプト 127.0.0.1:6379> が表示されます。

PUBLISH コマンドを使って、mychannel チャネルにメッセージを公開します。

PUBLISH mychannel "Hello, Redis!"

ターミナル 2 には、メッセージを受信したクライアント数が表示されます。

(integer) 1

この場合、ターミナル 1mychannel を購読しているため、出力は (integer) 1 になります。

ターミナル 1 でメッセージを確認する

ターミナル 1(ステップ 1 で mychannel を購読したターミナル)に戻ります。先ほど公開したメッセージがリアルタイムで表示されているはずです。

1) "message"
2) "mychannel"
3) "Hello, Redis!"

これは次の内容を示しています。

  • "message":公開されたメッセージであることを示します。
  • "mychannel":メッセージが公開されたチャネルです。
  • "Hello, Redis!":実際のメッセージ内容です。

リアルタイムメッセージングを試す

これでリアルタイムメッセージングを試せます。ターミナル 2 でさらにメッセージを公開し、ターミナル 1 に戻ってメッセージがすぐに表示されることを確認してください。さまざまなメッセージを送信して、リアルタイム通信の動作を観察してみましょう。

例:ターミナル 2 で実行します。

PUBLISH mychannel "This is message 2"
PUBLISH mychannel "Real-time messaging works!"

重要ターミナル 1ターミナル 2 の両方で、redis-cli のセッションをアクティブな状態に保ってください。次のステップでも両方のターミナルを使用します。

UNSUBSCRIBE で購読を解除する

このステップでは、Redis の UNSUBSCRIBE コマンドを使ってチャネルの購読を解除する方法を学びます。購読を解除すると、特定のチャネルの購読者リストからクライアントが削除され、そのチャネルに公開された以降のメッセージを受信しなくなります。

ターミナル 1:購読モードを終了する

ターミナル 1(現在 mychannel を購読しているターミナル)に移動します。「Reading messages... (press Ctrl-C to quit)」という購読状態が表示されているはずです。

ターミナル 1 は購読モードになっているため、通常の Redis コマンドを直接実行できません。Ctrl+C を押して購読モードを終了し、ターミナルのプロンプトに戻ります。その後、Redis に再接続します。

redis-cli

続いて、UNSUBSCRIBE コマンドを実行します。接続を切断した時点ですでに購読は解除されていますが、このコマンドによって Redis の購読解除時の応答を確認できます。

UNSUBSCRIBE mychannel

Ctrl+C を押した時点で、実際にはすべての購読から切断されています。ここで示す UNSUBSCRIBE コマンドは動作を説明するためのものです。実際には、接続を切断するとすべてのチャネルの購読が自動的に解除されます。

ターミナル 1 には次のような出力が表示されます。

1) "unsubscribe"
2) "mychannel"
3) (integer) 0

出力の内容を確認しましょう。

  • "unsubscribe":チャネルの購読を解除したことを示します。
  • "mychannel":購読を解除したチャネルの名前です。
  • (integer) 0:現在購読しているチャネル数です。mychannel の購読を解除したため、0 になっています。

ターミナル 2:購読解除後の公開をテストする

ターミナル 2 に戻り、mychannel に別のメッセージを公開します。

PUBLISH mychannel "Is anyone still there?"

ターミナル 2 には次のように表示されます。

(integer) 0

これは、ターミナル 1 でチャネルの購読を解除したため、メッセージを受信したクライアントが存在しないことを示しています。

メッセージを受信していないことを確認する

ターミナル 1 を確認してください。チャネルの購読を解除しているため、新しいメッセージは表示されません。

このように、チャネルの購読を解除すると、そのチャネルに公開された以降のメッセージを受信しなくなります。一方、公開側は引き続きメッセージを送信できますが、受信するクライアントはいません。

重要:次のステップでも使用するため、両方のターミナルと redis-cli のセッションをアクティブな状態に保ってください。

PSUBSCRIBE でパターン購読する

このステップでは、Redis の PSUBSCRIBE コマンドを使ってパターンに一致するチャネルを購読する方法を学びます。PSUBSCRIBE を使うと、指定したパターンに一致する複数のチャネルをまとめて購読できます。関連するチャネルを 1 つずつ購読せず、まとめてメッセージを受信したい場合に便利です。

ターミナル 1:パターンを購読する

前のステップで mychannel の購読を解除したため、ターミナル 1 には通常の Redis プロンプトが表示されているはずです。

ターミナル 1 で、PSUBSCRIBE コマンドを使って news.* パターンに一致するチャネルを購読します。

PSUBSCRIBE news.*

次のような出力が表示されます。

Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

出力の内容を確認しましょう。

  • "psubscribe":パターンの購読に成功したことを示します。
  • "news.*":購読したパターンです。.* は任意の文字列に一致するワイルドカードです。
  • (integer) 1:現在購読しているパターン数です。

ターミナル 2:パターンに一致するチャネルへ公開する

ターミナル 2 に移動し、PUBLISH コマンドを使って news.sports チャネルにメッセージを公開します。

PUBLISH news.sports "Sports news update!"

ターミナル 2 には、メッセージを受信した購読者数が表示されます。

(integer) 1

パターン一致を確認する

パターンを購読している ターミナル 1 に戻ります。先ほど公開したメッセージが表示されます。

1) "pmessage"
2) "news.*"
3) "news.sports"
4) "Sports news update!"

これは次の内容を示しています。

  • "pmessage":パターンに一致したメッセージであることを示します。
  • "news.*":一致したパターンです。
  • "news.sports":実際にメッセージが公開されたチャネルです。
  • "Sports news update!":メッセージの内容です。

複数のチャネルをテストする

ターミナル 2 で、パターンに一致する別のチャネルにもメッセージを公開してみましょう。

PUBLISH news.technology "New AI breakthrough!"
PUBLISH news.weather "Sunny skies ahead!"
PUBLISH sports.basketball "This won't match the pattern"

ターミナル 1 で、news.* に一致するチャネルのメッセージだけが受信され、sports.basketballnews.* パターンに一致しないため受信されないことを確認してください。

重要:両方のターミナルと redis-cli のセッションをアクティブな状態に保ってください。パターン購読を使うと、関連する複数のチャネルを同時に監視できます。

まとめ

この実験では、Redis の Pub/Sub メッセージングの基本を学びました。SUBSCRIBE コマンドによるチャネルの購読、PUBLISH コマンドによるチャネルへのメッセージ公開、UNSUBSCRIBE コマンドによる購読解除、そして PSUBSCRIBE コマンドによるパターンを使ったチャネル購読を体験しました。これらのコマンドは、Redis を使ったリアルタイムメッセージングアプリケーションを構築するうえで重要な機能です。