发布与订阅
Redis的发布与订阅功能可以让客户端通过广播方式,将消息(message)同时发送给可能存在的多个客户端,并且发送消息的客户端不需要知道接收消息的客户端的具体信息。
在Redis中,客户端可以通过订阅特定的频道(channel)来接收发送至该频道的消息,我们把这些订阅频道的客户端称为订阅者(subscriber)。一个频道可以有任意多个订阅者,而一个订阅者也可以同时订阅任意多个频道。除此之外,客户端还可以通过向频道发送消息的方式,将消息发送给频道的所有订阅者,我们把这些发送消息的客户端称为发送者(publisher)。
指令
优缺点
优点:支持发布订阅,支持多组生产者、消费者处理消息
缺点:
- 消费者下线数据会丢失
- 不支持数据持久化,Redis宕机则数据也会丢失
- 消息堆积,缓存区溢出,消费者会被强制踢下线,数据也会丢失
SpringBoot集成Redis发布与订阅
自定义RedisSubConfig
@Configuration public class RedisSubConfig { @Bean public RedisMessageListenerContainer container(RedisConnectionFactory factory, RedisMessageListener listener) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(factory); //订阅频道 这个container 可以添加多个 messageListener container.addMessageListener(listener, new ChannelTopic("channel_demo")); //container.addMessageListener(listener, new ChannelTopic("redis.news")); return container; } @Bean public StringRedisSerializer stringRedisSerializer() { return new StringRedisSerializer(); } }
自定义消息监听器
@Slf4j @Component public class RedisMessageListener implements MessageListener { @Resource private StringRedisSerializer stringRedisSerializer; @Override public void onMessage(Message message, byte[] pattern) { String channel = stringRedisSerializer.deserialize(message.getChannel()); String body = stringRedisSerializer.deserialize(message.getBody()); log.info("消费Redis消息\n channel:{}\n body:{}", channel, body); } }
RedisPubController
@RestController @RequestMapping("/redis") public class RedisPubController { @Resource private StringRedisTemplate stringRedisTemplate; @GetMapping("/PUBLISH") public String getUserById(String message) { stringRedisTemplate.convertAndSend("channel_demo", message); return "message:" + message; } }
标签:订阅,container,springboot,redis,message,public,channel,客户端 From: https://www.cnblogs.com/ooo0/p/17191148.html