ホームページ  >  記事  >  Java  >  Redis のパブリッシュとサブスクライブとは何ですか?

Redis のパブリッシュとサブスクライブとは何ですか?

PHP中文网
PHP中文网オリジナル
2017-06-20 09:56:161591ブラウズ

プッシュ問題を解決するために、Redis のサブスクリプション発行モデルを使用することを考えました~。

概念的な説明については、多かれ少なかれ言及する必要があります:

什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~

手順

本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。

Redis サブスクリプションと公開コマンド

まず、Redis サーバーの確立に関して、関連するドキュメントを確認してください。情報を自分で調べて環境を構築してください

Redisでパブリッシュとサブスクライブを行うための簡単なコマンドは6つだけだと聞きました。つまり、パターン[パターン...] Patirts形式の形式に一致する1つ以上のチャネルにsubscribeを登録します。サブコマンド [引数 [引数 ...]]

  • 購読と公開システムのステータスを表示します

  • PUNSUBSCRIBE [パターン [パターン ...]]

  • 形式を満たすすべてのチャンネルから購読を解除します

  • チャンネル登録 [チャンネル...]

  • 1 つ以上のチャンネルを登録します

  • UNSUBSCRIBE [チャンネル [チャンネル...]]

  • チャンネルの登録を解除します

  • 例 1 - 登録
  • redis に接続します。 次に、コマンド

    SUBSCRIBE study
    を入力して、study という名前のチャンネルに登録します。
  • 次に勉強チャンネルにメッセージを送ります。 ~~

  • 例 2 - PUBLISH
  • 別のクライアントを開きます。グリフ レイアウトの一番上のクライアントをパブリッシャーとして使用します。「

    PUBLISH study "message1-go go go"
  • 」と入力すると、この時点でクライアント 1 がスタディ チャネルでメッセージを公開していることがわかります。 、クライアント 2 (調査チャンネルに登録している) は c1 によって公開されたメッセージを受信できますが、クライアント 3 は調査チャンネルに登録していないため、c1 によって送信されたメッセージを受信できません。
  • 例 3 - PSUBSCRIBE
次に、ブロガーの左手と右手をスローモーションで追ってください。 c3 に
PSUBSCRIBE study*

OK と入力し、次に c1 に

PUBLISH study "message2"

を入力します。 上の結果の図:

c3 はワイルドカードの形式を採用しており、調査チャンネルも正常に登録されています。

次に、c1 にコマンドの入力を続けます:

PUBLISH study:java "I hate java forever"

psubscribe を使用すると、study チャネルにサブスクライブするだけでなく、study を先頭とするチャネルにもサブスクライブすることがわかります。

例 4 - PUBSUB

c1 に pubsub チャネルと入力して取得します:

127.0.0.1:6379> PUBSUB channels

1) "study"

は、現在アクティブなチャネルを意味します。

Jedis はサブスクリプションパブリッシャーモデルを実装します

好了,上面通过命令行熟悉了一下Redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。

首先,我们使用jedis先订阅一个名为:study的频道

次に、最初にコマンドラインからメッセージをパブリッシュします:

その後、jedis を使用してプロジェクト内のメッセージをパブリッシュします:

普通に通信できます ~ そうそう ~

コア コード:

PublishMessage.java はメッセージを公開するためのスレッドを開始するために使用されます
private Logger logger = LoggerFactory.getLogger(PublishMessage.class);

@Resource
private JedisCluster jedisCluster;

/**
 * 发布消息
 *
 * @param channel 频道
 * @param message 信息
 */
public void sendMessage(final String channel, final String message) {
    Thread thread = new Thread(() -> {
        Long publish = jedisCluster.publish(channel, message);
        logger.info("服务器在: {} 频道发布消息{} - {}", channel, message, publish);
    });
    logger.info("发布线程启动:");
    thread.setName("publishThread");
    thread.start();
}

ChatSubscribe.java は JedisPubSub から継承されたサブスクリプション関連のイベントを処理するために使用されます

private Logger logger = LoggerFactory.getLogger(ChatSubscribe.class);

// 取得订阅的消息后的处理
@Override
public void onMessage(String channel, String message) {
    logger.info("订阅成功,接收到的消息为:频道-{},消息-{}", channel, message);
    RedisString.message = message;
}

// 取得按表达式的方式订阅的消息后的处理
@Override
public void onPMessage(String pattern, String channel, String message) {
    System.out.println("-----取得按表达式的方式订阅的消息后的处理-----");
    System.out.println(pattern + "=" + channel + "=" + message);
}

// 初始化按表达式的方式订阅时候的处理
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
    System.out.println("-----初始化按表达式的方式订阅时候的处理-----");
    System.out.println(pattern + "=" + subscribedChannels);
}

// 取消按表达式的方式订阅时候的处理
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
    System.out.println("-----取消按表达式的方式订阅时候的处理-----");
    System.out.println(pattern + "=" + subscribedChannels);
}

@Override
public void onPong(String pattern) {
    super.onPong(pattern);
}

// 初始化订阅时候的处理
@Override
public void onSubscribe(String channel, int subscribedChannels) {
    logger.info("初始化订阅信息:频道-{},订阅频道-{}", channel, subscribedChannels);
}

// 取消订阅时候的处理
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
    logger.info("已取消订阅频道{}", channel);
}

SubScribeMessage.java チャネルへのサブスクリプション、チャネルのキャンセルなどアクションクラス

rree

以上がRedis のパブリッシュとサブスクライブとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。