# SpringBoot Redis 发布订阅

# 概述

Redis提供了发布/订阅(Publish/Subscribe)模式,用于实现消息的广播异步通信。下面是关于Redis发布/订阅模式的介绍。

# 发布/订阅模式(Pub/Sub)

发布/订阅模式是一种消息通信模式,其中消息的发布者(Publisher)将消息发送到特定的频道(Channel),而订阅者(Subscriber)可以订阅一个或多个频道以接收消息。这种模式允许消息的广播和异步传递,发送者和接收者之间解耦。

# Redis 的发布/订阅功能

Redis提供了原生的发布/订阅功能,使得开发者可以使用Redis作为消息中间件来实现高效的消息传递。以下是与Redis发布/订阅相关的关键概念和操作:

概念 说明
频道(Channel Redis中用于发布和订阅消息的通道。每个消息都被发布到一个特定的频道,而订阅者可以选择订阅一个或多个感兴趣的频道。
发布消息(Publish 通过使用PUBLISH命令,发布者可以将消息发送到指定的频道。一旦消息被发布到频道,所有订阅该频道的客户端将接收到该消息。
订阅频道(Subscribe 通过使用SUBSCRIBE命令,客户端可以订阅一个或多个频道。一旦订阅成功,客户端将成为该频道的订阅者,可以接收到该频道上发布的消息。
取消订阅频道(Unsubscribe 通过使用UNSUBSCRIBE命令,客户端可以取消对一个或多个频道的订阅。当客户端不再对某个频道感兴趣时,可以选择取消订阅。
模式匹配订阅(Pattern Subscription Redis支持使用PSUBSCRIBE命令进行模式匹配订阅。通过指定一个模式,可以订阅与该模式匹配的多个频道。

# 核心源码实现

基于spring-boot-starter-data-redis实现Redis发布订阅。

# 消息发布

redisTemplate.convertAndSend("MY_CHANNEL", "message");
1

# 消息订阅

实现MessageListener

@Slf4j
public class MyMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(pattern);
        String key = new String(message.getBody());
        log.info("MyMessageListener key message:[{}] from channel: [{}]", key, channel);
        // TODO 业务逻辑
    }
}
1
2
3
4
5
6
7
8
9
10
11

配置监听规则

@Slf4j
@Configuration
public class RedisAutoConfiguration {
    
    @Bean
    public ChannelTopic topic() {
        return new ChannelTopic("MY_CHANNEL"); // 定义消息队列的通道名称
    }

  
    @Bean
    public MyMessageListener myMessageListener() {
        return new MyMessageListener();
    }

    @ConditionalOnBean(MyMessageListener.class)
    @Bean
    public MessageListenerAdapter messageListenerAdapter(MyMessageListener messageSubscriber) {
        return new MessageListenerAdapter(messageSubscriber);
    }

    /**
     * 配置redis监听容器
     */
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter messageListenerAdapter, ChannelTopic topic) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(messageListenerAdapter, topic);

        //模式匹配订阅频道
//        List<PatternTopic> topicList = Arrays.asList(new PatternTopic("life.*"),new PatternTopic("*.life"));
//        container.addMessageListener(lifeRedisMessageListener, topicList);
        
        return container;
    }
   
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Redis发布/订阅(Pub/Sub)适用于需要即时通知、实时事件处理和实时数据传递的场景,例如:二级缓存实时通知其他服务删除缓存配置中心长轮询获取实时配置

# 参考文档

Last Updated: 5 months ago