Redis订阅里头的信息到底是咋组织的,结构那些东西怎么理解和应用
- 问答
- 2026-01-11 20:37:31
- 2
要理解Redis订阅里的信息是咋组织的,你不能把它想象成一个普通的数据库,比如存用户信息的那种表,它更像是一个村里的“大喇叭”广播系统,或者一个微信群里的群公告,它的核心目的不是存储数据让你以后查询,而是为了“实时通知”。
我们得弄清楚几个关键角色,这比死记硬背专业术语管用多了(来源:Redis官方文档对PUB/SUB的概述)。
频道:这是信息的“主题”或“地址”
你可以把频道想象成一个个不同的电视频道,CCTV-新闻”频道、“湖南卫视”频道,或者微信群里的不同话题组,吃货群”、“拼车群”,每条信息都属于一个特定的频道,想听什么内容,你就得调到那个频道上去,在Redis里,频道就是一个简单的字符串名字,news.sports 或者 order.updates。

发布者:负责说话的人
发布者就是那个拿着大喇叭喊话的人,或者在微信群里发公告的人,它的任务很简单:选择好一个频道,然后往这个频道里“扔”一条消息,它只管发,发完就走,完全不关心有没有人听、谁在听、听了之后会怎样,在Redis里,执行 PUBLISH news.sports "中国队夺冠!" 命令的那个客户端,就是发布者。
订阅者:负责听的人
订阅者就是那些想听消息的人,他们需要做的是:告诉自己感兴趣的一个或多个频道,比如说“我想听‘新闻’频道的消息”,然后就开始竖起耳朵等待,一旦有发布者往这个频道发了消息,Redis就会立刻把这条消息“推”给所有订阅了该频道的订阅者,在Redis里,执行 SUBSCRIBE news.sports 命令的客户端,就是订阅者。

信息到底是咋组织的呢?
Redis内部并没有为订阅功能建立一个特别复杂的“数据库”来存储这些消息,它的组织方式非常轻量级:

- 一个全局的字典(你可以理解为一个大本子): Redis服务器维护着一个东西,这个本子里记录着所有频道的名字。
- 频道名对应一个订阅者名单: 在每个频道名字的下面,不是一个一个的消息,而是一个“列表”,这个列表里记录着所有当前订阅了这个频道的客户端(订阅者)是谁。
- 信息的传递是“即发即弃”的: 当发布者发出一条消息时,Redis会立刻做下面这件事:拿着频道名,去那个大本子里找到对应的订阅者名单,然后像邮差一样,把这条消息一模一样地、挨个儿送到名单上的每一个订阅者手里,消息本身不会被Redis保存下来,如果某个订阅者当时不在线(网络断了),那么很抱歉,这条消息它就永远错过了,Redis不会为它留着。
怎么理解和应用这种结构?
理解了这种“大喇叭”模式,你就能明白它适合用在什么场景,不适合用在什么场景了。
典型应用场景(来源:常见Redis实践案例):
- 实时消息系统: 这是最直接的用法,比如一个在线聊天室,每个房间就是一个频道,用户A在“房间1”频道发一句话,Redis会立刻把这句话推送给所有订阅了“房间1”的其他用户,网页或App端收到消息后实时显示出来。
- 状态更新广播: 比如一个外卖App,当商家接单、骑手取餐、骑手送达时,后端系统可以分别向
order.12345.status这个频道发布消息,用户的手机App一直订阅着这个频道,就能实时看到订单状态的更新进度条,而不需要用户自己不停地下拉刷新。 - 微服务之间的解耦: 假设你有“用户服务”和“积分服务”,当用户注册成功时,“用户服务”不需要直接去调用“积分服务”的接口(这样两个服务就紧紧绑定了),它只需要向一个叫
user.registered的频道发布一条消息,内容是“用户ID: 10086注册了”,而“积分服务”只需要订阅这个频道,一旦听到消息,就自动为用户ID 10086初始化积分,这样,两个服务互不打扰,即使积分服务暂时宕机了(重启后它重新订阅),也不会影响用户注册(只是暂时没送积分而已),系统的韧性更强。 - 数据失效通知: 当Redis作为缓存时,可以用订阅功能来通知其他服务器:“我这里的某某数据已经删除了,你们也赶紧更新一下自己的缓存吧!”
重要的局限性(你必须知道的):
- 消息不持久化: 这是最大的特点也是最大的限制,消息就像广播里的声音,说过就没了,如果订阅者中途断开连接再重连,断开期间错过的所有消息都找不回来了,所以它不能用于需要保证消息必达的场景,比如扣款通知。
- 无法堆积: 如果没有订阅者,消息就直接丢弃了,它不像消息队列(如Kafka、RabbitMQ),可以把消息存起来等消费者慢慢处理。
- 负载均衡困难: 一条消息会发给所有订阅者,如果你有多个相同的服务订阅了同一个频道想来分担工作,那么它们会同时收到同一条消息,导致重复处理,这种情况下,你需要的是消息队列的“竞争消费者”模式,而不是Pub/Sub。
Redis订阅里的信息组织方式核心就是“频道-发布-订阅”模型,它通过一个非常简单的结构(频道名到订阅者列表的映射)来实现高效的、实时的消息广播,你把它当成一个只管传达、不管保管的“传令兵”就对了,用它来做实时通知、系统解耦非常高效,但千万别指望它来保证重要消息的可靠传递。
本文由帖慧艳于2026-01-11发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/78898.html
