使用redis实现MQ消息队列

我们在说到StringRedisTemplate的时候,不得不提一下RedisTemplate,这两个对象都是操作redis的,我们经常也会看到,那么他们之间有什么区别点,查看相关文档总结如下:

    1。两者的关系是StringRedisTemplate继承RedisTemplate。
    2。两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
    3。其实他们两者之间的区别主要在于他们使用的序列化类:
 RedisTemplate使用的是JdkSerializationRedisSerializer    存入数据会将数据先序列化成字  节数组然后在存入Redis数据库。  StringRedisTemplate使用的是StringRedisSerializer
使用时注意事项:
   当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。

   但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

RedisTemplate使用时常见问题:
    redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null。可以使用 StringRedisTemplate 试试。

redis不仅是一个非常强大的非关系型数据库,它同时还拥有消息中间件的pub/sub功能,在spring boot中进行如下设置就可以使用redis的pub/sub功能
环境依赖
创建一个新的springboot工程,在其pom文件,加入spring-boot-starter-data-redis依赖:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
创建一个消息接收者
REcevier类,它是一个普通的类,需要注入到springboot中。
@Component
public class Receiver {
    private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class);
 
    public void receiveMessage(String message) {
        LOGGER.info("Received <" + message + ">");
    }
}
  
  

注入消息监听容器
在spring data redis中,利用redis发送一条消息和接受一条消息,需要三样东西:

创建一个Redis消息配置类
连接工程我们使用Spring Boot默认的RedisConnectionFactory
我们将在listenerAdapter方法中定义的Bean注册为一个消息监听者,它将监听messagepush和messagepush3两个主题的消息。

因为Receiver类是一个POJO,要将它包装在一个消息监听者适配器(实现了MessageListener接口),这样才能被监听者容器RedisMessageListenerContainer的addMessageListener方法添加到连接工厂中。有了这个适配器,当一个消息到达时,就会调用receiveMesage()方法进行响应。


一个连接工厂
一个消息监听容器
Redis template
上述1、3步已经完成,所以只需注入消息监听容器即可:// container.addMessageListener(listenerAdapter, new PatternTopic("chat"));中chat为监听的消息的key和 template.convertAndSend("chat", "Hello from Redis!");中的chat必须相同,第二个为需要参数,MessageListenerAdapter(receiver, "receiveMessage");中第一个为类名的小写,第二个为调用的方法

@Configuration
public class RedisConfig {

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {
 
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅主题messagepush和messagepush3以及chat
        container.addMessageListener(listenerAdapter, new PatternTopic("messagepush"));
        container.addMessageListener(listenerAdapter, new PatternTopic("messagepush3"));
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
      //这个container 可以添加多个 messageListener
        return container;
    }
 //利用反射来创建监听到信息之后的执行方法 Receiver为操作的类
    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
    //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
  @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }

测试
在springboot入口的main方法:

public static void main(String[] args) throws Exception{
        ApplicationContext ctx =  SpringApplication.run(SpringbootRedisApplication.class, args);
        StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);
 
        LOGGER.info("Sending message...");
        //向通道发送信息,chat代表通道topic  hello。。。w为参数
        template.convertAndSend("chat", "Hello from Redis!");
 
       try {
            Thread.sleep(1000);
        }catch (Exception e){
            
        }
 
        System.exit(0);
    }
    
    如果有多个topic时可用下面处理:
     @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory factory , @Qualifier("adapter1") MessageListener adapter1, @Qualifier("adapter2") MessageListener adapter2) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        container.addMessageListener(adapter1, new PatternTopic("10086"));
        container.addMessageListener(adapter2, new PatternTopic("000000"));
        return container;
    }
     @Bean(name="adapter1")
    public MessageListener adapter1(MsgReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
    @Bean(name="adapter2")
    public MessageListener adapter2(MsgReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage2");
    }
    用@bean(XXX)注册多个MessageListener对象,然后在container参数中使用@Qualifier加入如上使用可接受

猜你喜欢

转载自blog.csdn.net/zpflwy1314/article/details/105792115