# Spring Boot 实现 Redis 消息的发布订阅功能

Redis的发布订阅模式,其本质和传统的MQ的发布订阅是差不多的,相对来说,Redis的使用更加便捷,也更加轻量化,不需要单独去搭建集成一套繁重的MQ框架。 但缺点也很明显,Redis发布的消息不会持久化,所以当某一台服务器出现问题的时候,这个消息会被丢失掉。所以在考虑使用之前要慎重,当前的业务是否对数据一致性要求很高,如果要求很高,还是建议使用MQ产品

MAVEN

<!-- 添加redis依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1
2
3
4
5

# 发布消息

   private RedisTemplate<String, String> redisTemplate;

   redisTemplate.convertAndSend(String channel, Object message);
1
2
3

# 订阅消息

# 实现MessageListener

@Slf4j
@Service
public class MyMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("接收数据: [{}] , 订阅频道: [{}]", message.toString(), new String(message.getChannel()));
    }

}
1
2
3
4
5
6
7
8
9
10

# RedisMessageListenerContainer 配置

@ConditionalOnBean(MyMessageListener.class)
@Configuration
public class MyRedisMessageListenerContainer {

    @Autowired
    private MyMessageListener myMessageListener;

    @Bean
    public MessageListenerAdapter messageListener() {
        return new MessageListenerAdapter(myMessageListener);
    }

    @Bean
    public RedisMessageListenerContainer redisContainer(RedisConnectionFactory factory) {
        final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        // 设置 container 其他的配置,例如:setRecoveryInterval
        
        // 也可以使用 PatternTopic 匹配多个频道
        container.addMessageListener(messageListener(), new ChannelTopic("topic"));
        return container;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 参考文档

Last Updated: 3 years ago