Redis Pub/Sub 是 Java 中实现轻量级实时消息通知的最直接方式,适用于订单状态提醒等无需持久化的场景;需配置 RedisConnectionFactory、RedisMessageListenerContainer 和 MessageListener,并注意多实例广播、无消息确认等限制。

Java 中用 Redis 实现轻量级消息通知,Pub/Sub 是最直接的方式——它不依赖外部中间件,延迟低、上手快,适合实时性要求高、消息无需持久化的场景,比如订单状态变更提醒、用户在线状态广播、系统事件通知等。
核心组件与配置要点
Spring Data Redis 提供了开箱即用的封装,关键在于三个部分:
- RedisConnectionFactory:建立与 Redis 的连接,推荐使用 Lettuce(线程安全,支持响应式)或 Jedis(简单轻量)
- RedisMessageListenerContainer:消息监听容器,负责管理订阅生命周期、分发消息到监听器
- MessageListener 接口实现类:处理收到的消息,业务逻辑写在这里
订阅端:接收并处理通知
定义一个监听器,实现 MessageListener 接口:
public class NotificationListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String channel = new String(message.getChannel());
String content = new String(message.getBody());
System.out.println("【通知】频道=" + channel + ", 内容=" + content);
// 这里可触发短信、邮件、WebSocket 推送等
}
}
再通过 RedisMessageListenerContainer 注册该监听器,并指定监听的频道(如 "notify:order" 或通配符 "notify:*"):
立即学习“Java免费学习笔记(深入)”;
- 用
addMessageListener(listener, new ChannelTopic("notify:order"))订阅具体频道 - 用
addMessageListener(listener, new PatternTopic("notify:*"))支持模糊匹配
发布端:触发一次通知
使用 StringRedisTemplate 的 convertAndSend() 方法即可:
stringRedisTemplate.convertAndSend("notify:order", "ORDER_10086_CREATED");
返回值不是必须关注的,但要注意:该调用会立即返回,且只统计当前在线的订阅者数量。如果无人在线,消息就丢弃——这正是 Pub/Sub “即发即弃”特性的体现。
注意事项与避坑提示
Pub/Sub 在 Java 应用中容易忽略几个关键点:
- 监听容器需在 Spring 容器启动时初始化并运行,否则收不到消息;建议设为
@Bean并确保非 lazy 初始化 - 监听器方法
onMessage是异步执行的,不要在其中做耗时同步操作(如远程 HTTP 调用),应交由线程池或响应式链路处理 - 若应用多实例部署,每个实例都会收到同一份消息(广播语义),需根据业务判断是否需要去重或分片消费
- 不支持消息确认、重试、死信队列等功能,不适合金融对账、日志归集等强可靠性场景


















