Redis发布订阅实战


我们都熟悉 Redis 的缓存功能,如果你还未了解过可以先过一遍之前的文章: Spring Boot 集成 Redis 缓存。但与 Kafka 一样, Redis 同样支持发布订阅功能,下面介绍如何在 Spring Boot 项目中实现 Redis 的发布订阅功能。

1. 依赖导入

在开始之前需要引入 Redis 的相关依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 订阅者

在发送消息之前首先要创建订阅着以接收消息,这里我创建了两个订阅者。

(1) 订阅者一

新建订阅类 ListenerTest1 并实现 MessageListener 接口,重写 onMessage() 方法,用于编写接收消息的具体处理逻辑。

public class ListenerTest1 implements MessageListener {

    Logger logger = LoggerFactory.getLogger(ListenerTest1.class);

    @Override
    public void onMessage(Message message, byte[] pattern) {
        logger.info("订阅者 - 1号, 接收到消息:" + new String(message.getBody()));
    }
}
(2) 订阅者二

同理新建第二个订阅类 ListenerTest2

public class ListenerTest2 implements MessageListener {

    Logger logger = LoggerFactory.getLogger(ListenerTest2.class);

    @Override
    public void onMessage(Message message, byte[] pattern) {
        logger.info("订阅者 - 2号,接收到消息:" + new String(message.getBody()));
    }
}

3. 配置文件

新建配置类 ChannelConfig 实现订阅者于通道 Topic 的绑定。

@Configuration
public class ChannelConfig {

    /**
     * 配置类中注入连接工厂
     */
    @Autowired
    private LettuceConnectionFactory connectionFactory;

    /**
     * 建立频道与监听器关系
     */
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        // 注入连接工厂
        container.setConnectionFactory(connectionFactory);
        // 频道绑定监听器 1 号
        container.addMessageListener(new ListenerTest1(), new ChannelTopic("myChannel-1"));
        // 频道绑定监听器 2 号
        container.addMessageListener(new ListenerTest2(), new ChannelTopic("myChannel-2"));
        return container;
    }
}

4. 发送者

新建测试接口,通过 convertAndSend() 方法发送消息,当发送消息时订阅者便会在日志中打印接收的信息。

如下示例中分别添加了两个示例接口 /send1/send2 用于往不同的通道发送消息。

@RestController
@RequestMapping("/api/redis/channel")
public class SendTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/send1")
    public void channel1(@RequestParam("message") String message) {
        // 发送消息
        redisTemplate.convertAndSend("myChannel-1", message);
    }

    @GetMapping("/send2")
    public void channel2(@RequestParam("message")  String message) {
        // 发送消息
        redisTemplate.convertAndSend("myChannel-2", message);
    }
}

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录