1 はじめに
Redis は、文字列、ハッシュ、リスト、セット、順序付きセットなど、さまざまなデータ構造をサポートする高速なオープンソースのメモリ内データベースです。基本的なデータの保存および取得機能に加えて、Redis は多くの高度な機能も提供します。その 1 つがパブリッシュおよびサブスクライブ (Pub/Sub) です。
パブリッシュ/サブスクライブは、メッセージのパブリッシャー (パブリッシャー) が、サブスクライバーの存在を意識せずに複数のサブスクライバー (サブスクライバー) にメッセージを送信できるようにするメッセージング パターンです。このパターンは、リアルタイム通知、イベント処理、チャット アプリケーションなど、多くのアプリケーションで非常に役立ちます。
2. パブリッシュとサブスクライブの使用方法
2.1. チャンネルを購読する
チャンネルに登録するには、まず SUBSCRIBE
コマンドを使用する必要があります。という名前のチャネルがあるとします notifications
。チャネルを購読するサンプル コードは次のとおりです。
[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> SUBSCRIBE notifications
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "notifications"
3) (integer) 1 # 返回值为当前已订阅的频道数量
notifications
上記のコマンドを実行すると、現在のクライアントはサブスクリプション状態になり、チャネルからのメッセージを待ち続けます 。チャネルが存在しない場合、クライアントはメッセージがチャネルにパブリッシュされるまでブロックされます。
2.2. リリースニュース
指定したチャネルにメッセージをパブリッシュするには、 PUBLISH
コマンドを使用します。チャネルにメッセージを投稿する notifications
サンプル コードを次に示します。
パブリッシャー (メッセージをパブリッシュ):
[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> publish notifications "hello world!"
(integer) 1
上記のコマンドを実行すると、 notifications
チャネルに登録しているすべてのクライアントが「hello world!」というメッセージを受け取ります。
"message"
"notifications"
"hello world!"
2.3. サブスクリプションのキャンセル
クライアントが特定のチャネルからメッセージを受信する必要がなくなった場合は、 UNSUBSCRIBE
コマンドを使用してサブスクライブを解除できます。チャネル名が指定されていない場合、クライアントはすべてのチャネルの購読を解除します。
UNSUBSCRIBE notifications
2.4. パターンのサブスクリプション
通常のチャネル サブスクリプションに加えて、Redis はパターン サブスクリプション (パターン サブスクリプション) もサポートしています。パターン サブスクリプションを使用すると、クライアントは特定のパターンを満たすチャネルにサブスクライブできます。
たとえば、「notifications:」で始まり、その後にさまざまなカテゴリ (「notifications:news」、「notifications:sports」など) が続くチャネル名が複数あるとします。「notifications:」で始まるすべてのチャネルを購読するには、次のコマンドを使用できます。
PSUBSCRIBE notifications:*
2.5. キャンセルモードサブスクリプション
モード サブスクリプションをキャンセルするには PUNSUBSCRIBE
、このコマンドを使用します。その使用方法は、通常のチャネル サブスクリプションをキャンセルするのと似ています。
PUNSUBSCRIBE notifications:*
subscription コマンドについては、次の 2 つの点に注意してください。
- クライアントは、subscription コマンドの実行後にサブスクリプション状態に入り、subscribe、psubscribe、unsubscribe、punsubscribe の 4 つのコマンドのみを受信できます。
- Redis はパブリッシュされたメッセージを保持しないため、新しく開かれたサブスクリプション クライアントはチャネルから以前のメッセージを受信できません。
3. ユースケース (疑似コード)
メッセージ通知: Web アプリケーションでは、パブリッシュおよびサブスクライブ機能を使用して、新しいメッセージや新しい注文などのリアルタイム通知をすべてのオンライン ユーザーに送信できます。
Redis パブリッシャーコード:
import redis.clients.jedis.Jedis;
public class RedisPublisher {
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 发布消息到频道
jedis.publish("notifications", "Hello, world!");
// 关闭连接
jedis.close();
}
}
// Redis サブスクライバー コード
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class RedisSubscriber extends JedisPubSub {
@Override
public void onMessage(String channel, String message) {
System.out.println("Received message: " + message + " from channel: " + channel);
// 在这里可以实现发送通知给在线用户的逻辑
}
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 创建订阅者实例
RedisSubscriber subscriber = new RedisSubscriber();
// 订阅频道
jedis.subscribe(subscriber, "notifications");
// 关闭连接
jedis.close();
}
}
4. Redis パブリッシュおよびサブスクライブと ActiveMQ および RocketMQ の違い
Redis のパブリッシュとサブスクライブ、ActiveMQ および RocketMQ は異なるタイプのメッセージング システムであり、次のような違いがあります。
-
メッセージ キュー パターンとパブリッシュ/サブスクライブ パターン:
- ActiveMQ と RocketMQ はメッセージ キュー システムであり、メッセージ キュー パターンに従います。メッセージ キューは 1 つ以上のコンシューマにメッセージを送信します。各メッセージは 1 つのコンシューマによってのみ処理されます。
- Redis のパブリッシュおよびサブスクライブはパブリッシャー/サブスクライバー モデルであり、メッセージを複数のサブスクライバーにブロードキャストできます。
-
耐久性:
- ActiveMQ と RocketMQ は通常、メッセージの永続性をサポートしており、コンシューマがオフラインになってもメッセージが失われないようにします。
- Redis のパブリッシュとサブスクライブは、デフォルトでは永続性をサポートしません。メッセージが送信された後、購読者がそれを受信しない場合、メッセージは失われます。
-
特徴:
- ActiveMQ と RocketMQ は、メッセージの再試行、メッセージの順序の保証、メッセージの遅延などの豊富な機能を提供します。
- Redis のパブリッシュとサブスクライブは比較的単純で、主にリアルタイムの通知と単純なメッセージのパブリッシュとサブスクライブに使用されます。
-
分散機能:
- ActiveMQ と RocketMQ はどちらも分散環境向けに設計されており、クラスタリングと負荷分散をサポートしています。
- Redis は分散環境で使用できますが、そのパブリッシュおよびサブスクライブ機能は比較的単純であり、複雑な分散シナリオでは ActiveMQ や RocketMQ ほど柔軟性がありません。
全体として、メッセージ キュー モデルに重点を置いた機能豊富なメッセージング システムが必要な場合は、ActiveMQ または RocketMQ を選択できます。また、単純なパブリッシュおよびサブスクライブ機能のみが必要な場合は、Redis パブリッシュおよびサブスクライブが適しています。