springboot redis 发布与订阅
发布与订阅
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;
}
}

浙公网安备 33010602011771号