当前位置: 首页 > 工具软件 > xRedis > 使用案例 >

springboot 2.x redis 实现消息队列

金霄
2023-12-01

 

一. 常用消息队列工具

  目前常用的消息队列大概有三种类型,RabbitMQ等AMQP系列, Kafka, Redis等kev value系列,它们的使用场景分别是: 
  1.RabbitMQ: 相对重量级高并发的情况,比如数据的异步处理 任务的串行执行等. 
  2.Kafka: 基于Pull的模式来处理,具体很高的吞吐量,一般用来进行 日志的存储和收集. 
  3.Redis: 轻量级高并发,实时性要求高的情况,比如缓存,秒杀,及时的数据分析

 

.二. SpringBoot基于Redis集成消息队

1.消息发布:使用redisTemplate.convertAndSend


@RestController
@RequestMapping
public class PublisherController {

    @Autowired
	private RedisTemplate<Object, Object> redisTemplate;

    @GetMapping(value = "pub/{msg}")
    public String pubMsg(@PathVariable String msg){
        redisTemplate.convertAndSend("demochannel",id);
        return msg;
    }
}

 

2.消息订阅

package com.cxm.consumer;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;


@Configuration
public class RedisSubConfig {

	/**
	 * 创建连接工厂
	 *
	 * @param connectionFactory
	 * @param adapter
	 * @return
	 */
	@Bean
	public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
			MessageListenerAdapter adapter) {
		RedisMessageListenerContainer container = new RedisMessageListenerContainer();
		container.setConnectionFactory(connectionFactory);
		//监听对应的channel
		container.addMessageListener(adapter, new PatternTopic("demochannel"));
		return container;
	}

	/**
	 * 	绑定消息监听者和接收监听的方法
	 * @param message
	 * @return
	 */
	@Bean
	public MessageListenerAdapter adapter(RedisMessageListener message) {
		// onMessage 如果RedisMessage 中 没有实现接口,这个参数必须跟RedisMessage中的读取信息的方法名称一样
		return new MessageListenerAdapter(message, "onMessage");
	}

}

MessageListener

@Component
public class RedisMessageListener implements MessageListener {

	@Autowired
	private RedisTemplate<Object, Object> redisTemplate;
	
	@Override
	public void onMessage(Message message, byte[] pattern) {
		RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
		String msg = serializer.deserialize(message.getBody());
		System.out.println("接收到的消息是:" + msg);
	}

}

 

 类似资料: