springboot redis 发布与订阅

发布与订阅

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

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

指令

优缺点

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

缺点:

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

SpringBoot集成Redis发布与订阅

自定义RedisSubConfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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();
    }
 
}

自定义消息监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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;
    }
 
}

 

posted @   草木物语  阅读(1225)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-03-08 钉钉 回调事件 消息加解密
点击右上角即可分享
微信分享提示