Redis Pub/Sub

Pub/Subはメッセージング通信パターンです。このレッスンでは、Redisのパブリッシュ/サブスクライブ機能について解説します。

Pub/Subとは

Pub/Subパターンは以下の要素で構成されます:

パブリッシャー → チャンネル → サブスクライバー1
                    → サブスクライバー2
                    → サブスクライバー3

基本コマンド

SUBSCRIBE:チャンネルにサブスクライブ

REDIS
# 単一のチャンネルにサブスクライブ
SUBSCRIBE channel1

# 複数のチャンネルにサブスクライブ
SUBSCRIBE channel1 channel2 channel3

サブスクライブ後、クライアントはメッセージを受信する待機状態になります。

PUBLISH:メッセージを公開

REDIS
# チャンネルにメッセージを公開
PUBLISH channel1 "Hello, Redis!"
(integer) 2  # メッセージを受信したサブスクライバーの数を返す

UNSUBSCRIBE:サブスクライブ解除

REDIS
# すべてのチャンネルからサブスクライブ解除
UNSUBSCRIBE

# 特定のチャンネルからサブスクライブ解除
UNSUBSCRIBE channel1

パターンサブスクリプション

PSUBSCRIBE:パターンマッチサブスクリプション

REDIS
# パターンに一致するチャンネルにサブスクライブ
PSUBSCRIBE news.*  # news.で始まるすべてのチャンネルにサブスクライブ

# 例
PSUBSCRIBE user:*:notifications  # すべてのユーザー通知チャンネルにサブスクライブ

PUNSUBSCRIBE:パターンサブスクリプションの解除

REDIS
# すべてのパターンサブスクリプションを解除
PUNSUBSCRIBE

# 特定のパターンサブスクリプションを解除
PUNSUBSCRIBE news.*

ユースケース

1. リアルタイムメッセージプッシュ

例:リアルタイム通知

BASH
# ターミナル1:通知にサブスクライブ
SUBSCRIBE notifications

# ターミナル2:通知を公開
PUBLISH notifications "New user registered"
▶ 試してみよう

2. チャットルーム

例:チャットルーム

BASH
# ユーザー1:チャットルームにサブスクライブ
SUBSCRIBE chatroom:general

# ユーザー2:メッセージを送信
PUBLISH chatroom:general "Hello everyone!"
▶ 試してみよう

3. システム通知

例:システムアラート

BASH
# 管理者:システムアラートにサブスクライブ
SUBSCRIBE system:alerts

# システム:アラートを送信
PUBLISH system:alerts "High CPU usage detected"
▶ 試してみよう

メッセージ形式

サブスクライバーが受信するメッセージ形式:

TEXT
1) "message"           # メッセージタイプ
2) "channel1"          # チャンネル名
3) "Hello, Redis!"     # メッセージ内容

パターンサブスクリプションのメッセージ形式:

TEXT
1) "pmessage"          # メッセージタイプ
2) "news.*"            # サブスクライブしたパターン
3) "news:sports"       # 実際のチャンネル名
4) "Game result!"      # メッセージ内容

重要な注意点

⚠️ メッセージは永続化されません: Pub/Subのメッセージは保存されません。サブスクライバーはサブスクライブ後に送信されたメッセージのみを受信します。

⚠️ メッセージ損失: サブスクライバーが切断した場合、その期間に送信されたメッセージは失われます。

💡 代替手段: メッセージの永続化が必要な場合は、RedisのStreamsやListsをメッセージキューとして使用してください。

Redis Stream(推奨)

Redis 5.0で導入されたStreamsは、より優れたメッセージキューソリューションです:

REDIS
# メッセージを追加
XADD mystream * name "Alice" action "login"
"1638361451780-0"

# メッセージを読み取り
XREAD COUNT 1 STREAMS mystream 0

# コンシューマーグループ
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >

Stream vs Pub/Sub

機能 Pub/Sub Stream
メッセージ永続化 ❌ 非永続化 ✅ 永続化
メッセージ確認応答 ❌ ACKなし ✅ ACK対応
コンシューマーグループ ❌ 非サポート ✅ サポート
履歴メッセージ ❌ 取得不可 ✅ クエリ可能
使用例 リアルタイム通知 メッセージキュー

❓ よくある質問

Q Pub/Subのメッセージは保存されますか?
A いいえ。Pub/Subは「fire and forget」で、メッセージは永続化されません。
Q 切断されたサブスクライバーは履歴メッセージを受信できますか?
A いいえ。メッセージの永続化が必要な場合は、StreamsまたはListsを使用してください。
Q チャンネルはいくつのサブスクライバーを持つことができますか?
A 理論上は無制限です。サーバーのパフォーマンスに依存します。

📖 まとめ

📝 練習問題

  1. サブスクリプションの練習: 2つのターミナルを使用して、一方がサブスクライブし、もう一方が公開しましょう
  2. パターンサブスクリプション: PSUBSCRIBEを使用して複数の一致するチャンネルにサブスクライブしましょう
  3. Streamの練習: XADD/XREADを使用してシンプルなメッセージキューを実装しましょう

次のレッスン

次のレッスンでは、Redis Transactionsについて学びます。トランザクションの使用方法と注意点を解説します。

100%