Redis implémente l'implémentation spécifique des fonctions de publication et d'abonnement

1 : Parlez-moi de la scène utilisée à cette époque

Étant donné que le serveur doit appeler le client, les requêtes http ne peuvent pas être utilisées ici, car le PC du client n'a pas d'adresse IP fixe, tout comme un téléphone mobile. Si vous devez envoyer des messages, une planification des tâches doit être effectuée. Mais lors de la planification des tâches, le problème de l'envoi continu de messages en boucle est le suivant :

1 : Une boucle continue est requise. Si vous n’avez besoin d’appuyer que quelques fois par jour, elle peut être appelée des milliers de fois.

2 : La boucle doit avoir un intervalle de temps et ne peut pas être déclenchée en temps réel.

En raison des deux problèmes ci-dessus, j'ai découvert le mécanisme de liens longs de netty et le mécanisme d'envoi du framework mqtt. Parce qu'ils sont trop compliqués et difficiles à intégrer dans le projet, j'ai choisi d'utiliser le mécanisme de publication et d'abonnement de redis .

Fonctionnalités de publication et d'abonnement :

1 : Appuyez uniquement lorsqu'il y a des nouvelles, pas besoin de récupérer différentes boucles.

2 : déclenchement du message en temps réel, pas besoin d'attendre, délai

3 : Les canaux peuvent être utilisés pour réaliser une poussée point à point, c'est-à-dire qu'ils peuvent être fixés sur un client spécifique ou un certain type de client.

Cela résout le problème du déclenchement par le serveur des événements client. En termes simples, le serveur peut déclencher l'interface d'implémentation de la méthode du client selon les besoins. Bien entendu, la méthode client ne peut pas être comprise ici comme une API et elle ne peut pas être appelée directement.

Comme le montre la figure, il n'y a pas de relation directe entre le serveur (l'éditeur peut également comprendre le client du service redis) et le client (abonné).

 2 : Utilisez directement la console Redis pour implémenter la publication et l'abonnement

1 : Recherchez redis-cli.exe dans le chemin Redis installé

 2 : Double-cliquez pour ouvrir un lien client : saisissez la clé ci-dessus : abonnez-vous

Abonnétest d' abonnement1

    SUBSCRIBE channel [channel ...]

 Abonnez-vous à une ou plusieurs chaînes données.

test1 est une chaîne, c'est-à-dire que l'éditeur doit publier sur cette chaîne pour que l'abonné puisse recevoir le message, sinon le message ne sera pas reçu.

 Éditeur : publier le message test1

Lorsqu'un message est publié sur l'éditeur, l'abonné peut immédiatement recevoir un message avec un contenu associé.

    PUBLISH channel message

  Envoyer un message d'information au canal spécifié.

Troisième : Intégration de la fonction de publication et d'abonnement Redis dans le cadre de démarrage Java-Spring

Pour le processus spécifique d'intégration de Redis avec Spring Boot, veuillez vous référer à :

Bon sang, l'intervieweur m'a en fait demandé d'utiliser Redis pour implémenter une file d'attente de messages ! ! ? -Jianshu

Voici l'implémentation de la fonction de publication et d'abonnement basée sur ce document

1 : Continuez à ajouter des méthodes basées sur la configuration RedisConfig d'origine. Toutes les copies sont les suivantes :

Choses à noter ici :

containers.addMessageListener(listenerAdapter, new PatternTopic("test1"));Il s'agit du canal d'écoute,

test1 est le nom du canal, ce qui signifie que tous les messages de ce canal peuvent être surveillés.

La méthode addMessageListener ici peut écouter plusieurs canaux, qui peuvent être une liste

abonné:

@Configuration
    public class RedisConfig {
     
        @Bean
        public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
            RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(factory);
            GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
            // 值采用json序列化
            redisTemplate.setValueSerializer(serializer);
            //使用StringRedisSerializer来序列化和反序列化redis的key值
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            // 设置hash key 和value序列化模式
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(serializer);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
     
        @Bean
        public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                       MessageListenerAdapter listenerAdapter) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
     
            Collection<Topic> lists = new ArrayList();
            Topic list1= new PatternTopic("test1");
            Topic list2= new PatternTopic("test2");
            Topic list3= new PatternTopic("test3");
     
            lists.add(list1);
            lists.add(list2);
            lists.add(list3);
            container.addMessageListener(listenerAdapter,lists);
            //container.addMessageListener(listenerAdapter, new PatternTopic("test1"));
            return container;
        }
     
        /**
         * 绑定消息监听者和接收监听的方法,必须要注入这个监听器,不然会报错
         */
        @Bean
        public MessageListenerAdapter listenerAdapter() {
            return new MessageListenerAdapter(new Receiver(), "receiveMessage");
        }
     
    }

2 : L'une des classes de la configuration ci-dessus est une classe personnalisée : Receiver

Ajouter une classe dans le contrôleur : Receiver,

package com.unit.mapping.controller;
     
    public class Receiver {
        public void receiveMessage(String message) {
            System.out.println(message);
        }
    }

3 : Éditeur : Ceci peut être implémenté dans n’importe quel autre projet :

Utilisez redisTemplate.converAndSend("channel", "send message"); Si vous l'envoyez comme ça, le projet ci-dessus peut le recevoir.

Par exemple : une fois que mon service est appelé par un certain front-end, je dois distribuer ce message, mais à qui ? Cela dépend de la chaîne. J'ai juste besoin d'ajouter ce code ci-dessous. Ajoutez simplement les messages qui doivent être distribués au modèle.

 package com.unit.mapping.controller;
     
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
     
    import javax.annotation.Resource;
     
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TestPack {
        @Resource
        private RedisTemplate redisTemplate;
        @Test
        public void test(){
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
                redisTemplate.convertAndSend("test1","这是我发送的第"+i+"个消息");
            }
        }
    }

Je suppose que tu aimes

Origine blog.csdn.net/qq_16504067/article/details/131675614
conseillé
Classement