Redis实现订阅通知

发布订阅功能是一个普遍的需求,消息队列也可以进行该功能的实现,这里展示redis怎么实现订阅通知。

1.建立一个任务池

/** 任务池 **/
@Bean
public ThreadPoolTaskScheduler initTaskScheduler() {
    ThreadPoolTaskScheduler taskPool = new ThreadPoolTaskScheduler();
    taskPool.setPoolSize(20);
    return taskPool;
}

暂时设置为20个任务大小进行测试

2.建立监听容器

/** 监听容器 **/
@Bean
public RedisMessageListenerContainer initRedisContainer(RedisMessageListener listener) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(jedisConnectionFactory());
    container.setTaskExecutor(initTaskScheduler());
    //定义监听渠道
    ChannelTopic topic = new ChannelTopic("topic1");
    container.addMessageListener(listener,topic);
    return container;
}

3.建立监听器,需要@Component交给IOC监听容器才能拿到

@Component
@Slf4j
public class RedisMessageListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] bytes) {
        //消息体
        String body = new String(message.getBody());
        //渠道名称
        String topic = new String(bytes);

        log.info("接收到消息:{}",body);
        log.info("由{}渠道发送而来",topic);
    }
}

4.测试

@GetMapping("/listener")
public String testListener() {
    redisTemplate.convertAndSend("topic1","hello world");
    return "发送完毕";
}

到此显示已经可以正常的通信了,但是当服务器没启动时,在redis控制台publish topic1 msg,在启动服务并不会通知,即消息的可靠性并不确定,相对而言还是更推荐使用消息队列

### 如何使用Redis实现订阅发布通知功能 Redis 提供了一种基于 **Pub/Sub**(发布/订阅)模式的消息通信方式,允许客户端订阅特定的频道,并接收来自其他客户端发布的消息。这种机制的核心在于解耦消息的生产者和消费者,使得它们无需直接交互即可完成消息传递。 #### Pub/Sub 基本概念 Redis 的 Pub/Sub 功能通过 `PUBLISH`、`SUBSCRIBE` 和 `PSUBSCRIBE` 等命令实现了消息的广播机制[^2]。具体来说: - **发布者**:负责向某个频道发送消息。 - **订阅者**:监听一个或多个频道,当有新消息到达时会立即接收到这些消息。 - **频道**:作为消息传输的载体,类似于主题(Topic),连接了发布者与订阅者。 以下是具体的实现方法: --- ### 1. 订阅者的实现 订阅者可以通过执行 `SUBSCRIBE` 或 `PSUBSCRIBE` 命令来注册感兴趣的频道。 例如,在 Redis 客户端中运行以下命令可以订阅名为 `weibo` 的频道: ```bash SUBSCRIBE weibo ``` 一旦成功订阅,任何针对该频道的消息都会被推送到订阅者处[^5]。 如果希望支持通配符匹配,则可改用 `PSUBSCRIBE` 来订阅一组符合条件的频道: ```bash PSUBSCRIBE news.* ``` --- ### 2. 发布者的实现 发布者利用 `PUBLISH` 命令将数据分发至目标频道上的所有活跃订阅方。下面是一个简单的例子,展示如何向 `weibo` 频道推送两条不同的消息: ```bash PUBLISH weibo "hello, beijing" PUBLISH weibo "hello, redis" ``` 每次调用后返回的结果表示当前有多少个订阅者收到了这条信息。 --- ### 3. Java 中集成 Spring Boot + Redis 实现 Pub/Sub 为了更方便地管理复杂的业务逻辑以及提高开发效率,通常会在实际项目里借助框架如 Spring Data Redis 进行封装处理。这里给出一段完整的代码示例说明如何构建服务端程序来进行消息的通知操作。 #### (1)定义发布者组件 ```java @Service public class RedisPublisher { @Autowired private StringRedisTemplate redisTemplate; /** * 向指定频道发送一条新的消息 */ public void sendMessage(String channelName, String content){ System.out.println("正在向["+channelName+"]频道发送消息..."); this.redisTemplate.convertAndSend(channelName,content); } } ``` #### (2)配置监听器以捕获事件 为了让应用能够响应外部传入的数据变更情况,还需要额外声明一个专门用来拦截相关信号的对象类。 ```java @Component public class MessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String msgBody = new String(message.getBody()); String topic = new String(pattern); log.info("[{}] 收到了新消息: {}",topic,msgBody); // TODO 根据需求进一步加工或者转发给下游模块... } } ``` 最后记得激活容器扫描路径以便自动装配上述 Bean 并启动整个流程链路。 --- ### 总结 综上所述,无论是单纯依靠原生命令还是结合高级语言库扩展功能,都可以轻松达成预期效果即实时通讯能力。而后者由于具备更强灵活性所以更加适合现代软件架构设计思路下的大规模分布式环境部署方案考虑选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值