当前位置: 首页 > web >正文

(01)Redis 的订阅发布Pub/Sub

本文主要是用通俗易懂的话解释Redis Pub/Sub。

我发现公司的老项目 把这个订阅发布机制当成MQ来用了,这样想来也真是降本增效啊。习惯了使用火箭MQ的我,又得从头研究下订阅发布消息通讯。
我们暂且按照MQ的生产者 和消费者对应Redis中的 发布 和订阅。我记得之前面试过程中也有问过让你自己实现一个MQ 怎么实现。这种面试题考查的就是你对底层原理是否清晰。

Redis 是一个“中转站”:
订阅者把自己挂在频道上,Redis 帮你记住谁订阅了什么;
发布者只需要往频道发消息,Redis 就把这条消息“群发”给所有挂在这个频道上的订阅者。

Redis 用了什么数据结构实现?

Redis 的底层是用 字典(哈希表)+ 列表 实现的:

  • 一个大字典 channel -> list of clients
  • 每个键是一个频道名,值是订阅该频道的客户端列表
  • 每当有客户端订阅、取消订阅,Redis 就增删这个列表
  • 发布消息时,Redis 遍历这个列表,直接写到客户端连接中

举个例子🌰zz:

你可以把 Redis Pub/Sub 类比成一个微信群(频道)

  • 加群 = 订阅频道(SUBSCRIBE
  • 群发消息 = 发布(PUBLISH
  • 在线就能看到消息,退群/没加群就收不到
  • 群消息不保存历史记录,只能看直播

Redis “广播站”,它的工作大致流程如下:

订阅时:登记在广播站

  • 每个频道(channel)就像一个广播频率,比如“新闻频道”。
  • 当你用 SUBSCRIBE news 命令订阅时,Redis 把你这个客户端登记在 news 频道的订阅列表里
  • Redis 在内存里维护了一个结构,类似这样:
{"news": [客户端1, 客户端2],"sports": [客户端3]
}

发布时:广播给订阅者

  • 当另一个客户端用 PUBLISH news "今天有大新闻" 发送消息时:
    • Redis 会查一下:“谁订阅了 news 频道?”
    • 然后把 "今天有大新闻" 这条消息推送给所有订阅了这个频道的客户端(像群发短信一样)。

推送过程:不存消息,谁在线谁能收

  • Redis 是“推送+广播”机制,不是“存储+拉取”。
  • 如果你在发布那一刻不在线,或者没订阅这个频道,你就永远收不到那条消息了。
http://www.xdnf.cn/news/3076.html

相关文章:

  • 探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍
  • 【运维心得】银行运维交接的坑
  • 制作一款打飞机游戏33:碰撞体编辑
  • ollama运行qwen3
  • 【Leetcode 每日一题】2962. 统计最大元素出现至少 K 次的子数组
  • 如何对多维样本进行KS检验
  • UNIAPP项目记录
  • 【大厂实战】API网关进化史:从统一入口到智能AB分流,如何构建灰度无感知系统?
  • 【工具变量】上市公司30w+过度负债数据集(2004-2023年)
  • 【嘉立创EDA】如何无限制挖槽,快捷设计挖槽
  • Linux系统配置JDK
  • 哈工大《工程伦理》复习文档
  • 存储过程补充——定义条件、处理程序及游标使用
  • PID速度、电流、位置闭环
  • swagger2升级至openapi3的利器--swagger2openapi
  • Linux 用户管理
  • 数据处理方式 之 对数变换 和Box-Cox变换以及对应逆变换【深度学习】
  • JavaScript基础
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)
  • Qwen3术语解密
  • 【SAM2代码解析】数据集处理2
  • go打印金字塔
  • 探索行业的新可能 - 你有遇到这些挑战吗?
  • 创新应用 | 食堂餐牌显示的“秒变”革新
  • Python深度挖掘:openpyxl和pandas的使用详细
  • 优雅的酸碱中和反应动画演示工具
  • 仿腾讯会议——注册登录UI
  • docker 使用
  • 数据采集脱硫脱硝除尘实验装置
  • DTO,VO,PO,Entity