springboot整合Redis实现发布订阅

everybody good…,之前有分享过关于RabbitMq的相关文章,然后公司的技术领导就跟我说,其实redis也能实现MQ的一些功能,然后我就迫不及待的去了解下,就跟大家分享下,当然了,如果你的项目中已经引用的RabbitMq或其他的Mq就算了,但一般的项目中都回用到redis嘛,建议你们可以尝试实现一个消息的发布和订阅,不管是实现发送短信啊,还是其他的,反正可以试试嘛。

因为我们的项目是使用spingboot进行开发的,所有就直接用spingboot工程给大家具体的来演示下了。

配置和引入RedisTemplate

public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

    RedisTemplate<String, Object> template = new RedisTemplate<>();

    template.setConnectionFactory(factory);

    Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jacksonSeial.setObjectMapper(objectMapper);

    template.setValueSerializer(jacksonSeial);
    template.setKeySerializer(new StringRedisSerializer());

    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(jacksonSeial);
    template.afterPropertiesSet();

    return template;
}

当然了你不配置也能直接注入进行使用

@Bean
@ConditionalOnMissingBean(
    name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    RedisTemplate<Object, Object> template = new RedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

但如果你配置一些序列化的方式,redis服务端中保存的就是下面这段东西,表示还是手动配置序列化更好点。
在这里插入图片描述

通过反射将消息处理委托给目标侦听器方法的消息侦听器适配器
首个我们需要定义两个类作为消息的接收方RedisMessage ,RedisMessage2 。

@Component
public class RedisMessage2 {

	  @Autowired
	  private RedisTemplate redisTemplate;
	
	  public void onMessage2(String message) {
	      System.out.println("接收到的消息是:" + message);
	  }
}

然后再通过消息监听适配器将两个消费者给定义出来,并且指定出消费的方法,我这里用来消费的方法就是onMessage(),方法中的参数你也可以定义一个Object对象来接受。

@Bean
public MessageListenerAdapter adapter(RedisMessage message) {
    
    return new MessageListenerAdapter(message, "onMessage");
}

@Bean
public MessageListenerAdapter adapter2(RedisMessage2 message2) {

    return new MessageListenerAdapter(message2, "onMessage2");
}

然后我们还需要定义一个组件RedisMessageListenerContainer,他的作用就是容器为Redis消息监听器提供异步行为。处理聆听的底层细节,转换和消息调度。

@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
	                                              MessageListenerAdapter adapter,MessageListenerAdapter adapter2) {
	   RedisMessageListenerContainer container = new RedisMessageListenerContainer();
	   container.setConnectionFactory(connectionFactory);
	
	   //上面已经自定义了一个消息的监听器,addMessageListener就是将我们自定义的
	   //监听器加入到我们的容器中,且绑定一个队列,指定模式切指定channel
	   container.addMessageListener(adapter, new PatternTopic("msg"));
	   //我绑定了两个
	   container.addMessageListener(adapter2, new PatternTopic("msg2"));
	   return container;
}

以上就是定义了一个完整小消费者了。接下来就可以往我们的channel中发送消息了。
发送消息的代码其实挺简单的。

//Publishes the given message to the given channel.
//翻译:将给定的消息发布到给定的通道。
redisTemplate.convertAndSend("msg","罗里发送了一个消息");

以上就是使用使用redis实现消息的简易发送与订阅接受。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。以下是一个简单的 Spring Boot 整合 Redis 实现发布订阅消息的例子: 1. 首先,在 pom.xml 文件中添加 Redis 相关依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 在 application.properties 文件中配置 Redis 连接信息: ``` spring.redis.host=localhost spring.redis.port=6379 ``` 3. 创建一个 Redis 发布者: ``` @Component public class RedisPublisher { @Autowired private RedisTemplate<String, Object> redisTemplate; public void publish(String channel, Object message) { redisTemplate.convertAndSend(channel, message); } } ``` 4. 创建一个 Redis 订阅者: ``` @Component public class RedisSubscriber { @Autowired private MessageListenerAdapter messageListenerAdapter; @PostConstruct public void init() { redisTemplate.execute((RedisConnection connection) -> { connection.subscribe(messageListenerAdapter, "channel"); return null; }); } @PreDestroy public void destroy() { redisTemplate.execute((RedisConnection connection) -> { connection.unsubscribe(messageListenerAdapter, "channel"); return null; }); } } ``` 5. 在需要发布消息的地方调用 RedisPublisher 的 publish 方法: ``` @Autowired private RedisPublisher redisPublisher; redisPublisher.publish("channel", "message"); ``` 6. 在需要订阅消息的地方实现 MessageListener 接口: ``` @Component public class MyMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String channel = new String(message.getChannel()); String messageBody = new String(message.getBody()); System.out.println("Received message: " + messageBody + " from channel: " + channel); } } ``` 以上就是一个简单的 Spring Boot 整合 Redis 实现发布订阅消息的例子。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值