Maison > Java > javaDidacticiel > Qu'est-ce que Redis publier et s'abonner ?

Qu'est-ce que Redis publier et s'abonner ?

PHP中文网
Libérer: 2017-06-20 09:56:16
original
1637 Les gens l'ont consulté

J'ai pensé à utiliser le modèle de publication par abonnement de Redis pour résoudre le problème push~.

Quant à la description conceptuelle, je dois encore la mentionner plus ou moins :

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

Explication

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

Commandes d'abonnement et de publication Redis

Tout d'abord, permettez-moi de préciser qu'en ce qui concerne la construction du serveur Redis, veuillez vérifier vous-même les informations pertinentes pour créer l'environnement

J'ai entendu dire qu'il n'y avait que 6 commandes simples pour publier et s'abonner dans Redis. C'est-à-dire :

  • Modèle PSUBSCRIBE [motif ...]

  • Abonnez-vous à une ou plusieurs chaînes qui correspondent au format du modèle

  • PUBLIER le message de la chaîne

  • Publier le message sur la chaîne

  • Sous-commande PUBSUB [argument [argument ...]]

  • Afficher l'état du système d'abonnement et de publication

  • PUNSUBSCRIBE [modèle [modèle ...]]

  • Se désabonner de toutes les chaînes qui correspondent au format

  • S'ABONNER à la chaîne [chaîne ...]

  • Abonnez-vous à une ou plusieurs chaînes

  • Désabonner [chaîne [chaîne ...]]

  • Se désabonner de la chaîne


Exemple 1 - ABONNEZ-VOUS

Après vous être connecté à redis, tapez la commande

SUBSCRIBE study
Copier après la connexion

pour vous abonner à une chaîne nommée étude.

La chaîne d'étude enverra ensuite un message. ~~


Exemple 2 - PUBLIER

Ouvrez un autre client J'utilise celui du haut de la disposition des glyphes comme éditeur, tapez

PUBLISH study "message1-go go go"
Copier après la connexion

Vous pouvez. voyez que lorsque le client 1 publie un message dans le canal d'étude, le client 2 (abonné au canal d'étude) peut recevoir le message publié par c1, mais le client 3 ne peut pas recevoir c1 car il n'est pas abonné au canal d'étude envoyé.


Exemple 3 - PSUBSCRIBE

Maintenant, suivez la main gauche et la main droite du blogueur au ralenti. Tapez

PSUBSCRIBE study*
Copier après la connexion

OK dans c3, tapez maintenant

PUBLISH study "message2"
Copier après la connexion

dans c1 L'image du résultat ci-dessus :

c3 adopte la forme de caractère générique et modifie également le chaîne d'étude L'abonnement a réussi.

Ensuite, continuez à taper la commande en c1 :

PUBLISH study:java "I hate java forever"
Copier après la connexion

Vous pouvez voir qu'en utilisant psubscribe, vous vous abonnez non seulement à la chaîne d'étude, mais également à la chaîne dirigée par Study.


Exemple 4 - PUBSUB

Tapez la chaîne pubsub en c1 pour obtenir :

127.0.0.1:6379> PUBSUB channels

1) "study"
Copier après la connexion

signifie la chaîne actuellement active.


Jedis implémente le modèle d'éditeur par abonnement

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

首先,我们使用jedis先订阅一个名为:study的频道
Copier après la connexion

Ensuite, nous publions d'abord le message depuis la ligne de commande :

Après cela, nous utilisons jedis pour le faire dans le projet Publication du message :

Nous pouvons avoir une communication normale~Oh ouais~


Code principal :

PublishMessage.java est utilisé pour ouvrir un fil de discussion à publier messages

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();
}
Copier après la connexion

ChatSubscribe.java est utilisé pour gérer les événements liés aux abonnements, hérités de 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);
}
Copier après la connexion

SubScribeMessage.java pour l'abonnement aux chaînes, l'annulation des chaînes et d'autres classes d'action

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

private ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

@Resource
private JedisCluster jedisCluster;
/**
     * 订阅频道
     *
     * @param channel          频道
     * @param roomSubListerner
     */
    public void subscribeChannel(final String channel, final ChatSubscribe roomSubListerner) {

        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                jedisCluster.subscribe(roomSubListerner, channel);
            }
        });
    }

jedisCluster是否封装工具类,取自各位看官,核心代码已给出,请各位看官根据自身业务与逻辑,自行更改与优化代码。

本次示例程序采用tomcat 9.0 + spring + springmvc

使用了诸如:@RestController,@GetMapping等相关注解,便于开发,有兴趣可自行查阅spring相关资料。
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal