用Redis怎么搞实时监听和处理消息,边听边干活那种感觉
- 问答
- 2026-01-19 00:25:38
- 3
主要参考了Redis官方文档关于Pub/Sub和Streams的介绍,以及《Redis实战》等资料中关于消息处理模式的讨论,并结合常见的实时监听场景进行说明。)
用Redis实现“边听边干活”的消息处理,核心就是让它像一个永远在线的助手,你这边随时扔任务给它,它那边立马就能动手开始做,中间不磨蹭,Redis本身速度极快,内存操作,很适合这种需要快速响应的场景,常用的方法主要有两种路子:一种是传统的发布订阅(Pub/Sub),另一种是更强大的流(Streams),它们感觉不一样,适用场景也不同。
第一种路子:发布订阅(Pub/Sub)—— 像听广播,听了就算
这大概是理解起来最直接的方式,想象一下,你打开一个收音机,调到一个频道,然后就能听到这个频道里播放的内容,Redis的Pub/Sub就是这样的模式。
-
怎么搞?
- 得有一个或多个“听众”,在Redis里叫“订阅者”(Subscriber),它们执行
SUBSCRIBE命令,比如SUBSCRIBE news_order,这就等于戴上了耳机,开始监听名为news_order的这个频道,这个订阅者通常会是一个一直运行着的程序(比如一个后台进程或者一个协程),它会阻塞在那里,专心致志地等待消息到来。 - 有一个“播音员”,也就是“发布者”(Publisher),当有新的任务或消息需要处理时,它就执行
PUBLISH news_order "新订单来了,订单ID是1001",这条消息会瞬间被Redis服务器发送给所有当时正在监听news_order频道的订阅者。 - 订阅者程序一收到消息,它的回调函数或者处理逻辑就会被触发,立刻开始“干活”,比如解析订单信息、扣减库存、通知物流系统等。
- 得有一个或多个“听众”,在Redis里叫“订阅者”(Subscriber),它们执行
-
这种感觉的优缺点:
- 优点: 极其简单,上手快,订阅-发布”两个动作,概念清晰,因为是实时推送,延迟非常低,消息一来马上就能处理,确实是“边听边干活”的即时感。
- 缺点: 这种模式是“即发即忘”的,就像广播,你当时没开着收音机,那段新闻就错过了,不会给你重播,在Pub/Sub里,如果订阅者那个时候刚好因为网络问题、重启或者处理速度跟不上而断开连接,那么断开期间发布的所有消息就全部丢失了,发布者和Redis服务器都不会替它保留,它适合那种对少量消息丢失不敏感、追求极致速度的场景。
第二种路子:流(Streams)—— 像处理任务队列,更靠谱的“待办事项清单”
Redis 5.0引入的Streams数据结构,功能就强大得多,它更像是我们工作中用的任务队列或者待办事项列表,能更好地保证消息被可靠地处理。
-
怎么搞?
- 流(Stream)本身就是一个持久化的、只追加写入的消息日志,你可以把它想象成一个永远写不完的清单,发布者通过
XADD命令往这个流里添加消息,比如XADD order_stream * order_id 1001 status "pending",这里的让Redis自动生成一个唯一递增的ID,这个ID很重要,它是消息的顺序标识。 - 消费者(Consumer)这边,情况更丰富一些:
- 最简单的监听: 消费者可以用
XREAD命令,从流的某个位置(比如从头开始,或者从上次读到的地方)开始读取消息,你可以让XREAD阻塞等待,一旦有新消息就来一条读一条,然后处理一条,实现“边听边干活”。 - 更强大的消费者组(Consumer Group): 这是Streams的精华所在,你可以创建一个消费者组,来共同消费同一个流,这就像是一个团队在共同处理一个任务清单。
- 消息会被均衡地分给组内的多个消费者,这样可以横向扩展处理能力,一个人干活慢,那就多几个人一起干。
- 关键点在于“确认机制”:每个消费者从组里领到一条消息后,必须显式地发送一个
XACK命令,告诉Redis“这个活我干完了”,如果消费者处理消息时崩溃了,没有发送ACK,那么过一段时间后,这条消息会被重新分配给组里其他在线的消费者去处理,这就避免了消息因为某个消费者挂掉而丢失。 - 消费者组还会跟踪每个消费者的处理进度(Pending List),确保每条消息至少被处理一次。
- 最简单的监听: 消费者可以用
- 流(Stream)本身就是一个持久化的、只追加写入的消息日志,你可以把它想象成一个永远写不完的清单,发布者通过
-
这种感觉的优缺点:
- 优点: 消息是持久化的,不会因为消费者下线而丢失,支持多消费者负载均衡,处理能力更强,通过ACK机制提供了至少一次处理(at-least-once)的可靠性保证,非常适合重要的业务场景,比如订单处理、支付通知等。
- 缺点: 相比Pub/Sub稍微复杂一点,需要理解消费者组、ACK、Pending List这些概念,因为消息要持久化,会占用更多内存(当然Redis有修剪命令可以控制流的大小)。
怎么选?
- 如果你要的就是一种“通知”效果,比如实时推送在线用户数、广播简单的状态变化,消息丢几条无所谓,但要的就是快和简单,那Pub/Sub很合适。
- 如果你的“边听边干活”是处理正经的业务逻辑,比如订单、日志分析、需要保证任务一定被完成,并且可能还需要多个 worker 同时来处理积压的任务,那么Streams(特别是配合消费者组)是更专业、更可靠的选择,它提供了那种“活只要交到这个流水线上,就肯定有人给你干完”的踏实感。
用Redis搞实时监听,就是根据你对消息可靠性的要求,在“听广播”和“处理待办清单”这两种感觉之间做个选择。

本文由盈壮于2026-01-19发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/83346.html
