[SpringBoot]整合Redis实现发布订阅模式

本文介绍了Redis的发布订阅模式,包括生产者、消费者的概念,频道、消息发布者和接收者的角色,以及适用场景。在SpringBoot中整合Redis,通过配置RedisTemplate、添加消息监听器和定义消息处理器,实现消息的发布与订阅。文中还提到,监听器可以监听多个管道,订阅者通过实现MessageListener接口处理接收到的消息。

一、什么是生产者和消费者

顾名思义,生产者是发布消息的一方,消费者是接收消息的一方

二、什么是发布订阅模式?

1.频道

频道就类似于一个快递柜,快递员往里面放快递,我们去里面取快递。管道是由中间件(redis)提供的,一个redisServer中有多个channel。

2.消息发布者

消息发布者可以通过中间件(redis、mq等)向某个频道(管道)发送消息。

 3.消息接收者 

消息接收者可以通过订阅某个频道(管道)来接收发布者发布的消息。

如图

发布者无需关心是否有人接收消息,发布者只需要把消息发布到某个管道中即可。

 三、适用场景

1.处理下订单之后的一些业务:例如发邮件,写日志等,在下完订单后直接返回给用户结果,之后再异步去做后续的操作,提高了效率。

2.监听过期事件:订阅管道__keyevent@0__:expired(0代表第几号数据库),可以实现计时短信服务。

3.订阅up主、博主等功能

 四、SpringBoot整合

1.配置RedisTemplate,这个没什么多说的,就是序列化的一些问题

@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //把redis的连接工厂与模板对象绑定
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        //ObjectMapper 指定在转成json的时候的一些转换规则
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        //把自定义objectMapper设置到jackson2JsonRedisSerializer中(可以不设置,使用默认规则)
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        //RedisTemplate默认的序列化方式使用的是JDK的序列化
        //设置key的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        //设置hash key的序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        //设置hash value的序列化
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        //使redis受spring事务管理,坑很多
        //redisTemplate.setEnableTransactionSupport(true);
        //这里推荐使用模板类的execute方法进行事务管理

        return redisTemplate;
    }

2.往容器(RedisMessageListenerContainer)内添加消息监听器

注意,container的参数列表是可以传多个监听器的,但是要定义监听器的bean(第三步)。在定义监听器的方法体内绑定消息处理器管道,一个监听器可以监听多个管道(传数组就行)

    //可以传入多个listener
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter smsExpirationListener, MessageListenerAdapter createOrderListener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        // 设置连接工厂
        container.setConnectionFactory(redisConnectionFactory);
        // 监听当前库的key过期
        container.addMessageListener(smsExpirationListener, new PatternTopic("__keyevent@0__:expired"));
        // 监听order管道
        container.addMessageListener(createOrderListener, new PatternTopic("order"));

        return container;
    }

3.定义监听器,绑定消息处理器和默认方法

自我理解:监听器通过注入处理器的bean创建,然后监听器与管道绑定就可以实现发布订阅了。方法体内需要创建一个MessageListenerAdapter(这是一种规范写法,用于绑定消息处理器和监听器)。这里的参数需要订阅者(消息处理器),消息处理器的定义在第四步。

    //声明一个监听key过期的监听器
    //可以声明多个Listener给Container
    @Bean //bean的名字要对应到上面Container的参数列表中           参数是订阅者的bean
    public MessageListenerAdapter smsExpirationListener(SmsSubscriber messageListener) {
        return new MessageListenerAdapter(messageListener, "onMessage");
    }

    @Bean
    public MessageListenerAdapter createOrderListener(OrderSubscriber messageListener) {
        return new MessageListenerAdapter(messageListener, "onMessage");
    }

4.定义订阅者(消息处理器)

实现MessageListener接口,重写onMessage方法。然后就可以进行业务操作了。

@Component
public class OrderSubscriber implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        //手动去除""双引号
        String msg = message.toString().replace("\"", "");
        log.info("监听order,key:{},channel:{}", msg, new String(pattern));
    }

}

本人初学Redis的一些理解,如有异议或者错误,欢迎在评论区留言。后续我还会继续往上补充。

好的,我可以回答这个问题。以下是一个简单的 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 实现发布订阅消息的例子。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值