Redis implementa la implementación específica de funciones de publicación y suscripción.

1: Cuéntame sobre la escena utilizada en ese momento.

Debido a que el servidor necesita llamar al cliente, las solicitudes http no se pueden usar aquí, porque la PC del cliente no tiene una dirección IP fija, como un teléfono móvil. Si necesita enviar mensajes, debe programar la tarea. Pero al programar tareas, el problema de enviar mensajes continuamente en un bucle es:

1: Se requiere un bucle continuo. Si solo necesita presionar unas pocas veces al día, es posible que se llame miles de veces.

2: El bucle debe tener un intervalo de tiempo y no puede activarse en tiempo real.

Debido a los dos problemas anteriores, aprendí sobre el mecanismo de enlace largo de Netty y el mecanismo de envío del marco mqtt. Debido a que son demasiado complejos y difíciles de integrar en el proyecto, elegí utilizar el mecanismo de publicación y suscripción de Redis.

Funciones de publicación y suscripción:

1: Presione solo cuando haya noticias, no es necesario realizar una recuperación de bucle diferente.

2: Activar mensaje enviado en tiempo real, sin necesidad de esperar, retraso de tiempo

3: El canal se puede utilizar para lograr un envío punto a punto, es decir, se puede fijar a un cliente específico o a un determinado tipo de cliente.

Esto resuelve el problema de que el servidor active eventos del cliente. En términos simples, el servidor puede activar la interfaz de implementación del método del cliente según sea necesario. Por supuesto, el método del cliente no puede entenderse aquí como una API y no se puede llamar directamente.

Como se muestra en la figura, no existe una relación directa entre el servidor (el editor también puede entender al cliente del servicio redis) y el cliente (suscriptor).

 2: utilice directamente la consola de Redis para implementar la publicación y suscripción

1: busque redis-cli.exe en la ruta de redis instalada

 2: Haga doble clic para abrir el enlace de un cliente: ingrese la clave de arriba: suscríbase

Prueba de suscripción de suscriptor1

    SUBSCRIBE channel [channel ...]

 Suscríbete a un canal o canales determinados.

test1 es un canal, es decir, el editor debe publicar en este canal para que el suscriptor pueda recibir el mensaje, de lo contrario el mensaje no será recibido.

 Editor: publicar mensaje de prueba1

Cuando se publica un mensaje en el editor, el suscriptor puede recibir inmediatamente un mensaje con contenido relacionado.

    PUBLISH channel message

  Enviar mensaje de información al canal de canal especificado.

Tres: integración de la función de publicación y suscripción de Redis en el marco de arranque java-spring

Para conocer el proceso específico de integración de Redis con Spring Boot, consulte:

¡Qué diablos, el entrevistador me pidió que usara Redis para implementar una cola de mensajes! ! ? -Jianshu

Aquí está la implementación de la función de publicación y suscripción basada en este documento.

1: Continúe agregando métodos según la configuración original de RedisConfig. Todas las copias son las siguientes:

Cosas a tener en cuenta aquí:

container.addMessageListener(listenerAdapter, new PatternTopic("test1"));Este es el canal de escucha,

test1 es el nombre del canal, lo que significa que todos los mensajes de este canal se pueden monitorear.

El método addMessageListener aquí puede escuchar múltiples canales, que pueden ser una lista

abonado:

@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: Una de las clases en la configuración anterior es una clase personalizada: Receptor

Agregue una clase en el controlador: Receptor,

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

3: Editor: Esto se puede implementar en cualquier otro proyecto:

Utilice redisTemplate.converAndSend ("canal", "enviar mensaje"); si lo envía así, el proyecto anterior puede recibirlo.

Por ejemplo: después de que una determinada interfaz llame a mi servicio, necesito distribuir este mensaje, pero ¿a quién? Esto depende del canal. Solo necesito agregar este código a continuación. Simplemente agregue los mensajes que deben distribuirse a la plantilla.

 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+"个消息");
            }
        }
    }

Supongo que te gusta

Origin blog.csdn.net/qq_16504067/article/details/131675614
Recomendado
Clasificación