Spring Boot 使用Redis发布订阅模式处理消息

Spring Boot 使用Redis发布订阅模式

  • 1. Redis发布订阅模式
  • 2. Spring Boot中订阅消息
    • 2.1 Redis监听器容器配置
    • 2.2 创建通道监听器
    • 2.3 测试订阅功能
  • 3. 借助RedisTemplate发布消息
  • 4. 应用场景
  • 5. 更多参考文档

1. Redis发布订阅模式

自Redis 2.0.0起支持消息的发布订阅模式,命令行语法:

PUBLISH channel massage

Redis中的发布订阅模式中数据的流动基于channel(通道)来完成。
Spring Boot 使用Redis发布订阅模式处理消息_第1张图片

2. Spring Boot中订阅消息

此处不再介绍Spring Boot与Redis的整合,可以参考 Spring Data Redis。

2.1 Redis监听器容器配置

@Configuration
public class RedisConfig {
	 @Bean
	 public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory){
	     RedisMessageListenerContainer container = new RedisMessageListenerContainer();
	     container.setConnectionFactory(factory);
	     return container;
	 }
 }

2.2 创建通道监听器

test通道监听器:

@Component
public class TestRedisSubListener implements MessageListener {

    public TestRedisSubListener(RedisMessageListenerContainer listenerContainer) {
        listenerContainer.addMessageListener(this, new ChannelTopic("test"));
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println(getClass().getName() + ":" + "channel:" + new String(pattern) + ":" + message.toString());
        System.out.println();
    }
}

上边创建了“test”通道的监听器,当有消息发布到通道时,onMessage方法被自动回调。

test1通道监听器:

@Component
public class Test1RedisSubListener implements MessageListener {

    public Test1RedisSubListener(RedisMessageListenerContainer listenerContainer) {
        listenerContainer.addMessageListener(this, new ChannelTopic("test1"));
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println(getClass().getName() + ":" + "channel:" + new String(pattern) + ":" + message.toString());
        System.out.println();
    }
}

两个通道的消息互不影响!

2.3 测试订阅功能

在redis命令行发布消息:

PUBLISH test 123432423423423432423
PUBLISH test 你好世界!
PUBLISH test1 你好,陌生人!

控制台打印出:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3. 借助RedisTemplate发布消息

@Component
public class TestChannelMessagePublisher {
    private final RedisTemplate redisTemplate;

    public TestChannelMessagePublisher(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void pubshlishMessage(String mess) {
        redisTemplate.convertAndSend("test", mess);
    }
}

在业务处直接注入该类,然后调用pubshlishMessage方法即可向test通道发布消息。

4. 应用场景

  1. 消息广播,所有订阅了通道的监听者均能获得消息
  2. 消息群发,群发消息给系统登录用户

5. 更多参考文档

更多官方文档请参考https://docs.spring.io/spring-data/redis/docs/2.4.15/reference/html/#pubsub。

你可能感兴趣的:(Spring,Redis,redis,spring,boot,java,发布订阅模式)