Golang Redis 发布订阅(Pub/Sub)
Redis 发布订阅Pub/Sub一、Pub/Sub 是什么想象一下订单服务刚创建了一笔订单库存系统要减库存、通知服务要发短信、分析平台要记日志——如果每个服务之间都直接调 HTTP当第四个消费者加入时所有上游都得改代码。这种网状调用会随着系统变大而崩溃。发布订阅Pub/Sub翻转了这种模型Publisher ──(msg)── Redis ──(fan-out)── Subscriber A ── Subscriber B ── Subscriber C核心思想发布者只管往频道扔消息不关心谁在听。订阅者只管从频道收消息不关心谁发的。Redis 作为中间人负责路由。二、Redis Pub/Sub 的三个核心命令命令作用PUBLISH channel message向频道发送消息返回收到消息的订阅者数量SUBSCRIBE channel [channel ...]订阅一个或多个频道精确匹配PSUBSCRIBE pattern订阅匹配模式的所有频道如order:*一个关键性质消息不落地。Redis 不存储已发送的消息——如果订阅者掉线了错过就是错过了。这是 Pub/Sub 和消息队列RabbitMQ/Kafka的根本区别。三、Go 中的订阅与发布订阅者// 订阅者开启一个专用长连接持续接收消息pubsub:rdb.Subscribe(ctx,orders:new,payments:done)deferpubsub.Close()// Channel() 返回一个 Go channel把 Redis 的网络流转换为本地 channelch:pubsub.Channel()// 循环读消息阻塞直到来消息或 ctx 取消formsg:rangech{fmt.Printf([%s] %s\n,msg.Channel,msg.Payload)}关键细节Subscribe()后 Redis 客户端会分配一条专用 TCP 连接这条连接被锁定在 Pub/Sub 模式不能再执行普通命令GET/SET 之类的。这也是为什么生产环境通常给 Pub/Sub 单独配一个连接池。发布者// 发布一个 JSON 消息typeOrderEventstruct{OrderIDstringjson:order_idAmountfloat64json:amountStatusstringjson:status}event,_:json.Marshal(OrderEvent{OrderID:O-1024,Amount:99.9,Status:paid})n,_:rdb.Publish(ctx,orders:new,event).Result()fmt.Printf(消息触达 %d 个订阅者\n,n)PUBLISH的返回值是收到消息的订阅者数量——如果返回 0说明没人监听消息丢了。这是 Pub/Sub 的fire-and-forget天性。模式订阅用通配符监听一批频道// 订阅所有 order 相关事件orders:created, orders:cancelled, orders:paid...pubsub:rdb.PSubscribe(ctx,orders:*)ch:pubsub.Channel()formsg:rangech{fmt.Printf([%s → %s] %s\n,msg.Pattern,msg.Channel,msg.Payload)}*匹配一个层级如order:*匹配order:new但不匹配order:item:stock。如果需要多级匹配可以用order:**取决于 Redis 版本。四、Pub/Sub 的消息可靠性问题Pub/Sub 设计上是一条广播水管——水流过就没了。什么时候会丢消息场景后果订阅者未上线时发布消息消息丢失订阅者的 Channel 缓冲区满处理慢消息积压Redis 客户端可能主动断连网络闪断期间的消息丢失Redis 宕机重启所有订阅关系 未发消息全部消失解决方案Pub/Sub Stream 双通道Pub/Sub 负责实时推送Stream 负责消息持久化Publisher ──PUBLISH── Redis Pub/Sub ──实时推送── Subscriber ──XADD──── Redis Stream ──补偿读取── Subscriber掉线重连后在线时吃 Pub/Sub 的实时推送低延迟掉线后从 Stream 里按消费者组的 LastDeliveredID 往回拉取遗漏的消息这不是 Redis 内建功能而是应用层组合拳。五、Pub/Sub vs 其他消息模式维度Pub/SubRedis StreamsRabbitMQKafka消息持久化❌ 不持久化✅✅✅消费确认❌ 无✅ XACK✅ ACK✅ offset commit回溯重复消费❌✅✅✅延迟 1ms 1ms~ ms 级~ ms 级运维复杂度极低低中高适用场景实时广播、缓存失效通知、WebSocket 跨节点同步事件日志、消息队列、消费者组企业消息中间件大数据流处理一句话选型要实时 丢几条没事 → Pub/Sub要可靠 不能丢 → Streams。六、常见应用场景1. 跨节点缓存失效多个 Web 节点各自有本地缓存数据更新后通过 Pub/Sub 广播一个cache:invalidate:user:42所有节点同时清掉本地缓存。这是 Redis Pub/Sub 最经典的生产场景。2. WebSocket 跨节点消息推送用户连在节点 A 的 WebSocket 上但触发消息的服务跑在节点 B 上。B 发 Pub/Sub 到 RedisA 订阅并推给 WebSocket 客户端。Socket.IO 的 Redis Adapter 就是这个原理。3. 配置热更新配置中心更新配置后PUBLISH 一条通知。所有服务订阅了config:reload收到后立刻拉取最新配置。七、本章要点要点一句话Pub/Sub 是广播不是队列消息发完就消失没有重放、没有回执一条长连接一个 PubSubSubscribe 后连接被专用不要混用PSubscribe 用*通配可以监听整批频道省去逐个 SUBSCRIBE可靠性靠组合拳Pub/Sub 做实时通道Stream 做补偿兜底延迟极低亚毫秒级适合实时场景核心认知把 Pub/Sub 当成一个广播喇叭而非消息仓库来用就对了。

相关新闻

锤子助手第023个开关:启用对话内文本分词的位置、验证方法与文本隐私边界

锤子助手第023个开关:启用对话内文本分词的位置、验证方法与文本隐私边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/26 19:12:07 阅读更多 →
锤子助手第021个开关:启用灰度相机模式的位置、验证方法与影像真实性边界

锤子助手第021个开关:启用灰度相机模式的位置、验证方法与影像真实性边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/26 19:12:07 阅读更多 →
苹果连接热点显示低安全性

苹果连接热点显示低安全性

1、问题描述开发MIFI过程中发现,苹果手机连接热点显示安全性低,2、问题分析抓MIFI空口分析如下,相关群加密方式为TKIP,但是组加密方式有两个CCMP和TKIP相关群加密方式为CCMP,组加密方式CCMPTKIP、CCMP是两类无线加密协…

2026/8/26 19:10:54 阅读更多 →

最新新闻

反转神经网络:Inverting CNNs窥探模型内部世界(XAI-papers图解教程)

反转神经网络:Inverting CNNs窥探模型内部世界(XAI-papers图解教程)

反转神经网络:Inverting CNNs窥探模型内部世界(XAI-papers图解教程) 【免费下载链接】XAI-papers 项目地址: https://gitcode.com/gh_mirrors/xa/XAI-papers 你是否好奇过,CNN 是如何从成千上万个像素中"认出"一…

2026/8/26 19:45:38 阅读更多 →
大型量产固件的工程实践(八):多款同类型芯片驱动的统一抽象

大型量产固件的工程实践(八):多款同类型芯片驱动的统一抽象

大型量产固件的工程实践(八):多款同类型芯片驱动的统一抽象 本文是《大型量产固件的工程实践》专栏第 8 篇。 上一篇:第 7 篇实战《日志打印实现源码与使用范例》 | 下一篇:第 9 篇《GPIO 模拟 SPI 驱动设计》 一、问题:几十款同类芯片怎么管 一个支持多产品线的固件,…

2026/8/26 19:45:37 阅读更多 →
LLM那些事 08:MCP——给所有工具配一个统一的插口

LLM那些事 08:MCP——给所有工具配一个统一的插口

1. 引言:每接一个新东西,就要重新连一遍 上一篇《RAG》的结尾,我留了一个问题:模型到这一步已经够全能了——会说话、看得懂长文、记得住上下文、能表示语义、能伸手调工具。可每次让它干一件新事,我都要单独给它写一套…

2026/8/26 19:45:37 阅读更多 →
5分钟让 Windows 拥有 Mac 级中文显示:PingFangSC 六字重双格式字体包

5分钟让 Windows 拥有 Mac 级中文显示:PingFangSC 六字重双格式字体包

5分钟让 Windows 拥有 Mac 级中文显示:PingFangSC 六字重双格式字体包 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 做 PPT 时是不是发现 W…

2026/8/26 19:45:37 阅读更多 →
ROS2 执行器(Executor)与回调组(Callback Group)

ROS2 执行器(Executor)与回调组(Callback Group)

ROS2 作为分布式机器人开发框架,其核心事件驱动模型依赖执行器(Executor) 驱动回调函数执行,而回调组(Callback Group) 则是控制回调并发策略的核心机制。 一、概念 1.1 执行器(Executor&#x…

2026/8/26 19:45:37 阅读更多 →
从Swift 2到4.2:SwiftyTimer版本演进史与Swifty API设计哲学

从Swift 2到4.2:SwiftyTimer版本演进史与Swifty API设计哲学

从Swift 2到4.2:SwiftyTimer版本演进史与Swifty API设计哲学 【免费下载链接】SwiftyTimer Swifty API for NSTimer 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftyTimer SwiftyTimer 是一个用 Swift 编写的 NSTimer 定时器工具库,它提供 S…

2026/8/26 19:44:37 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →