最もユーザーフレンドリーでコードRedisの戦闘を公開するためにサブスクライブ

購読発行する紹介

単純なメッセージキュー外を達成するためのリスト機能を使用することに加えて、Redisのは、また、ニュース購読を公開するためのメカニズムを提供します。この機構では、加入者がチャネルと、指定されたチャネルメッセージを受信することができるサイト運営者が指定したチャンネルにメッセージを解放(チャネル)メッセージは、以下に示すように、複数のメッセージの加入者を有することができます。

ここに画像を挿入説明

Redisのコマンドでも、このメカニズムのためのいくつかのサポートを提供し、我々は、これらのコマンドについて詳しく説明します。

関連するコマンドを発行する購読

Redisのでは、パブリッシュ・サブスクライブ関連のコマンドは以下のとおりです。

  1. ニュースリリース
  2. サブスクリプション
  3. 登録解除
  4. モード契約に従い、
  5. 退会モードによると、
  6. クエリサブスクリプション情報

ニュースリリース

コマンドでは、と発表しましたpublish構文は次のとおりです。

publish 频道名称 消息

たとえば、チャンネルにしたい:1-もっと-研究:発表とデモのチャンネルを「私はワン・モア・研究しています。」と、コマンドは以下の通りであります:

> publish channel:one-more-study:demo "I am One More Study."
(integer) 0

加入者数、結果はゼロに戻されていない実施形態の加入者の結果を返します。

ニュースを購読

購読コマンドメッセージがされsubscribe、加入者が1つまたは複数のチャネルを購読することができ、構文は次のとおりです。

subscribe 频道名称 [频道名称 ...]

1-より-研究:たとえば、チャネルにサブスクライブし、次のようにデモチャンネル、コマンドは次のとおりです。

> subscribe channel:one-more-study:demo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel:one-more-study:demo"
3) (integer) 1

戻り結果は、それぞれ、3があります。値(サブスクリプション成功)の戻り値の型は、チャンネル番号は、サブスクライブされている、チャンネル名をサブスクライブします。加入者がメッセージを受信すると、それが表示されます:

1) "message"
2) "channel:one-more-study:demo"
3) "I am One More Study."

タイプ(情報)の戻り値、チャンネル名、ソース、およびメッセージ内容:3は、それぞれ表し、また結果です。

加入者は新しくオープンした、理由のRedisは、ニュースリリースをしなかった持続性の、チャネルの歴史の前にメッセージを受信することができません。

登録解除

登録解除コマンドはunsubscribe、あなたが1つまたは複数のチャネルにサブスクリプションをキャンセルすることができ、構文は次のとおりです。

unsubscribe [频道名称 [频道名称 ...]]

例えば、退会チャンネル:1 - もっと-研究:次のようにデモチャンネル、コマンドは次のとおりです。

> unsubscribe channel:one-more-study:demo
1) "unsubscribe"
2) "channel:one-more-study:demo"
3) (integer) 0

戻り結果は、それぞれ、3があります。値(退会成功)の戻り値の型は、サブスクリプションのチャンネル名を取り消し、チャンネル番号は、加入してきました。

プレスモード、サブスクリプション・メッセージ

押して、モードコマンドメッセージが加入しpsubscribe、与えられたパターンに一致する1つまたは複数のチャネルに加入し、構文は次のとおりです。

psubscribe 模式 [模式 ...]

*このようなチャネルとして印として、各モードで、*は、チャネル・コマンドで始まるすべてのチャネルに一致する次のとおりです。

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

戻り結果は、それぞれ、3があります。値(プレスモード契約が成功した)の戻り値の型は、サブスクリプションモデル番号は、サブスクライブモードとなっています。加入者がメッセージを受信すると、それが表示されます:

1) "pmessage"
2) "channel*"
3) "channel:one-more-study:demo"
4) "I am One More Study."

タイプ(情報)の戻り値、パターンマッチング・メッセージ、チャネル名、ソース、およびメッセージ内容:4は、それぞれの結果を、戻ってきました。

プレスモード退会

プレスモード退会命令punsubscribe、あなたが1つまたは複数のパターンにサブスクリプションをキャンセルすることができ、構文は次のとおりです。

punsubscribe [模式 [模式 ...]]

*なチャネルとして看板、各モード:*は、チャネル・コマンドで始まるすべてのチャネルに一致する次のとおりです。

1> punsubscribe channel:*
1) "punsubscribe"
2) "channel:*"
3) (integer) 0

戻り結果は、それぞれ、3があります。(退会成功をモデルによれば)値の戻り値の型の数は、サブスクリプションモデルを取り消し、それはサブスクリプションモデルを持っています。

クエリサブスクリプション情報

アクティブ・チャンネルを見ます

少なくとも一つの加入者チャネルを有するアクティブチャネル手段、構文は次のとおりです。

pubsub channels [模式]

例えば:

> pubsub channels
1) "channel:one-more-study:test"
2) "channel:one-more-study:demo"
3) "channel:demo"
> pubsub channels *demo
1) "channel:one-more-study:demo"
2) "channel:demo"
> pubsub channels *one-more-study*
1) "channel:one-more-study:test"
2) "channel:one-more-study:demo"
表示チャンネルサブスクリプション
pubsub numsub [频道名称 ...]

例えば:

> pubsub numsub channel:one-more-study:demo
1) "channel:one-more-study:demo"
2) (integer) 1
表示モードのサブスクリプション
> pubsub numpat
(integer) 1

コードの戦闘

ハンドルと注ぎ口リップオフは、我々は、パブリッシュ・サブスクライブの例シンプルを書くためにJava言語を使用します。

Jedisクラスタの例

Jedisは、私たちがJedisは、単純なクラスタの例を書く使用し、Redisの公式は、Java開発ツールの接続を推奨しています。

package onemore.study;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

/**
 * Jedis集群
 *
 * @author 万猫学社
 */
public enum Cluster {
    INSTANCE;

    //为了简单,把IP和端口直接写在这里,实际开发中写在配置文件会更好。
    private final String hostAndPorts = "192.168.0.60:6379;192.168.0.61:6379;192.168.0.62:6379";
    private JedisCluster jedisCluster;

    Cluster() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();

        //最大连接数
        poolConfig.setMaxTotal(20);
        //最大空闲数
        poolConfig.setMaxIdle(10);
        //最小空闲数
        poolConfig.setMinIdle(2);

        //从jedis连接池获取连接时,校验并返回可用的连接
        poolConfig.setTestOnBorrow(true);
        //把连接放回jedis连接池时,校验并返回可用的连接
        poolConfig.setTestOnReturn(true);

        Set<HostAndPort> nodes = new HashSet<>();
        String[] hosts = hostAndPorts.split(";");
        for (String hostport : hosts) {
            String[] ipport = hostport.split(":");
            String ip = ipport[0];
            int port = Integer.parseInt(ipport[1]);
            nodes.add(new HostAndPort(ip, port));
        }
        jedisCluster = new JedisCluster(nodes, 1000, poolConfig);
    }

    public JedisCluster getJedisCluster() {
        return jedisCluster;
    }
}

例えば、投稿者

package onemore.study;

import redis.clients.jedis.JedisCluster;

/**
 * 发布者
 *
 * @author 万猫学社
 */
public class Publisher implements Runnable {
    private final String CHANNEL_NAME = "channel:one-more-study:demo";
    private final String QUIT_COMMAND = "quit";

    @Override
    public void run() {
        JedisCluster jedisCluster = Cluster.INSTANCE.getJedisCluster();
        for (int i = 1; i <= 3; i++) {
            String message = "第" + i + "消息";
            System.out.println(Thread.currentThread().getName() + " 发布:" + message);
            jedisCluster.publish(CHANNEL_NAME, message);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("------------------");
        }
        jedisCluster.publish(CHANNEL_NAME, QUIT_COMMAND);
    }
}

加入者の例

package onemore.study;

import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPubSub;

/**
 * 订阅者
 *
 * @author 万猫学社
 */
public class Subscriber implements Runnable {
    private final String CHANNEL_NAME = "channel:one-more-study:demo";
    private final String QUIT_COMMAND = "quit";

    private final JedisPubSub jedisPubSub = new JedisPubSub() {
        @Override
        public void onMessage(String channel, String message) {
            System.out.println(Thread.currentThread().getName() + " 接收:" + message);
            if (QUIT_COMMAND.equals(message)) {
                unsubscribe(CHANNEL_NAME);
            }
        }
    };

    @Override
    public void run() {
        JedisCluster jedisCluster = Cluster.INSTANCE.getJedisCluster();
        jedisCluster.subscribe(jedisPubSub, CHANNEL_NAME);
    }
}

総合的な例

package onemore.study;

public class App {
    public static void main(String[] args) throws InterruptedException {
        //创建3个订阅者
        new Thread(new Subscriber()).start();
        new Thread(new Subscriber()).start();
        new Thread(new Subscriber()).start();
        Thread.sleep(1000);

        //创建发布者
        new Thread(new Publisher()).start();
    }
}

結果は以下の通りであります:

Thread-6 发布:第1消息
Thread-0 接收:第1消息
Thread-1 接收:第1消息
Thread-2 接收:第1消息
------------------
Thread-6 发布:第2消息
Thread-0 接收:第2消息
Thread-1 接收:第2消息
Thread-2 接收:第2消息
------------------
Thread-6 发布:第3消息
Thread-0 接收:第3消息
Thread-2 接收:第3消息
Thread-1 接收:第3消息
------------------
Thread-0 接收:quit
Thread-1 接收:quit
Thread-2 接收:quit
公開された53元の記事 ウォンの賞賛1316 ビュー20万+

おすすめ

転載: blog.csdn.net/heihaozi/article/details/105155596