Redis发布订阅功能-SpringBoot demo

简介

Redis的发布订阅是一种消息通信模式,发送者发布消息,订阅者接收消息。

它们的关系如下图所示:

对于消息发布者和订阅者来说,其实都是多对多关系。发布者可以向多个channel发布消息,订阅者自然也可以从多个channel接收消息。

这种发布订阅模式其实很像各种MQ,但是相对于这些MQ,redis则更为轻量化,当业务压力不大的时候,可以考虑采用Redis来代替MQ实现消息队列。

下面我们用SpringBoot来写个小demo体验一把Redis的发布订阅。这里的环境,redis本地启动,没有密码。

代码实现-发布者

@RestController
public class PublisherController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @GetMapping("/publish/{channel}/{message}")
    public String publishMessage(@PathVariable("channel") String channel, @PathVariable("message") String message) {
        redisTemplate.convertAndSend(channel, message);
        return "success";
    }

}

发布者的功能很简单,提供一个接口,可以实现往指定的channel发送消息即可。这里发送消息采用 redisTemplateconvertAndSend功能来实现。

代码实现-订阅者

@Component
public class RedisSubscriber {

    public void onMessage(String message, String pattern) {
        System.out.println("订阅者1收到信息:" + message + ", 来自" + pattern + "频道");
    }
}

@Component
public class AnotherRedisSubscriber {

    public void onMessage(String message, String pattern) {
        System.out.println("订阅者2收到信息:" + message + ", 来自" + pattern + "频道");
    }
}

这里我们弄两个发布者,后面分别订阅不同的channel进行对比

代码实现-配置类

这里的配置类是最关键的,在配置类里面指定订阅者,以及订阅者要订阅的channel。

@Configuration
public class RedisConfig {

    @Bean(name = "listener1")
    public MessageListenerAdapter listener1Adapter(RedisSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }

    @Bean(name = "listener2")
    public MessageListenerAdapter listener2Adapter(AnotherRedisSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }



    @Bean
    public RedisMessageListenerContainer container(@Qualifier("listener1") MessageListenerAdapter adapter1,
                                                   @Qualifier("listener2") MessageListenerAdapter adapter2,
                                                   RedisConnectionFactory factory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        container.addMessageListener(adapter1, Arrays.asList(new PatternTopic("channel1"), new PatternTopic("channel2")));
        container.addMessageListener(adapter2, Arrays.asList(new PatternTopic("channel2"), new PatternTopic("channel3")));
        return container;
    }
}

可以看到,我们分别声明了两个订阅者listener1和2,然后让listener1订阅channel1和channel2,listener2订阅channel2和channel3。这样两个listener各自有自己独自订阅的channel,也有共同订阅的channel。这里由于同时声明了两个相同类型的bean,所以在注入的时候要用 @Qualifier注解来指明。

效果演示

分别调用如下链接:

http://localhost:8080/publish/channel1/hello

http://localhost:8080/publish/channel2/hello

http://localhost:8080/publish/channel3/hello

http://localhost:8080/publish/channel4/hello

也就是分别向1,2,3,4这4个channel发送一条消息“hello”,这个时候我们查看日志

可以看到channel1和channel3,分别只有订阅者1和订阅者2接收到消息。channel2则是两个订阅者都能接收到消息。而channel4没有订阅者进行订阅,所以没有收到消息。到这里,redis的发布订阅功能就算是完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中使用Redis进行发布订阅可以通过以下步骤实现: 1. 配置Redis连接信息 在application.properties文件中配置Redis连接信息,包括Redis的IP地址、端口号、密码等。 ``` spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= ``` 2. 配置RedisTemplate 在Spring Boot中使用Redis需要使用到RedisTemplate,可以通过以下方式进行配置: ``` @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } } ``` 上述代码中,我们配置了RedisTemplate的序列化方式,使用了StringRedisSerializer和GenericJackson2JsonRedisSerializer进行序列化。 3. 实现发布者 通过RedisTemplate实现发布者,可以使用convertAndSend方法进行消息发布。 ``` @Service public class RedisPublisher { @Autowired private RedisTemplate<String, Object> redisTemplate; public void publish(String channel, Object message) { redisTemplate.convertAndSend(channel, message); } } ``` 上述代码中,通过@Autowired注入了RedisTemplate,并实现了publish方法,通过convertAndSend方法实现了消息的发布。 4. 实现订阅者 通过@RedisListener注解实现订阅者,可以监听Redis中指定的频道,实现消息的订阅。 ``` @Service public class RedisSubscriber { @RedisListener(channel = "test") public void onMessage(Object message) { System.out.println("Received Message: " + message); } } ``` 上述代码中,通过@RedisListener注解指定了监听的频道,实现了onMessage方法,当Redis中有消息发布到该频道时,该方法会被回调。 5. 测试 在Spring Boot中测试Redis发布订阅可以通过以下方式: ``` @RunWith(SpringRunner.class) @SpringBootTest public class RedisTest { @Autowired private RedisPublisher redisPublisher; @Test public void testPublish() { redisPublisher.publish("test", "Hello World!"); } } ``` 上述代码中,通过@Autowired注入了RedisPublisher,实现了testPublish方法,调用publish方法发布了一条消息到test频道中。 运行测试后,可以在RedisSubscriber的onMessage方法中看到收到了发布的消息。 以上就是Spring Boot中使用Redis进行发布订阅的详细步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值