一、什么是生产者和消费者
顾名思义,生产者是发布消息的一方,消费者是接收消息的一方
二、什么是发布订阅模式?
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的一些理解,如有异议或者错误,欢迎在评论区留言。后续我还会继续往上补充。
本文介绍了Redis的发布订阅模式,包括生产者、消费者的概念,频道、消息发布者和接收者的角色,以及适用场景。在SpringBoot中整合Redis,通过配置RedisTemplate、添加消息监听器和定义消息处理器,实现消息的发布与订阅。文中还提到,监听器可以监听多个管道,订阅者通过实现MessageListener接口处理接收到的消息。
1万+

被折叠的 条评论
为什么被折叠?



