首页 > 数据库 >springboot redis 发布与订阅

springboot redis 发布与订阅

时间:2023-03-08 10:44:34浏览次数:51  
标签:订阅 container springboot redis message public channel 客户端

发布与订阅

Redis的发布与订阅功能可以让客户端通过广播方式,将消息(message)同时发送给可能存在的多个客户端,并且发送消息的客户端不需要知道接收消息的客户端的具体信息。

在Redis中,客户端可以通过订阅特定的频道(channel)来接收发送至该频道的消息,我们把这些订阅频道的客户端称为订阅者(subscriber)。一个频道可以有任意多个订阅者,而一个订阅者也可以同时订阅任意多个频道。除此之外,客户端还可以通过向频道发送消息的方式,将消息发送给频道的所有订阅者,我们把这些发送消息的客户端称为发送者(publisher)。

指令

优缺点

优点:支持发布订阅,支持多组生产者、消费者处理消息

缺点:

  1. 消费者下线数据会丢失
  2. 不支持数据持久化,Redis宕机则数据也会丢失
  3. 消息堆积,缓存区溢出,消费者会被强制踢下线,数据也会丢失

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

相关文章