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

redis--发布订阅

redis的发布和订阅

在Redis中,发布-订阅(Publish-Subscribe,简称Pub/Sub)是一种消息传递模式,用于在不同的客户端之间传递消息,允许一个消息发布者将消息发送给多个订阅者。这种模式适用于解耦消息发送者和接收者之间的关系,使得消息的发送者不需要关心消息是由哪些订阅者接收。

介绍

发布者(Publisher):发布者负责将消息发送到指定的频道。频道可以看作是消息的主题,订阅者可以选择订阅感兴趣的频道来接收相应的消息。

订阅者(Subscriber):订阅者通过订阅一个或多个频道来接收发布者发送的消息。一旦订阅了某个频道,订阅者就会收到该频道上的所有消息。

频道(Channel):频道是消息的通道,发布者将消息发送到特定的频道,而订阅者可以选择订阅感兴趣的频道。

消息(Message):消息是发布者发送给订阅者的数据。一条消息可以是任意类型的数据,例如文本、JSON等。

常见命令

命令描述示例
PUBLISH将消息发布到指定的频道PUBLISH news_channel “新闻:Redis 发布订阅”
SUBSCRIBE订阅一个或多个频道,以接收发布者发送的消息SUBSCRIBE news_channel
UNSUBSCRIBE取消订阅一个或多个频道,停止接收消息UNSUBSCRIBE news_channel
PSUBSCRIBE使用模式匹配订阅一个或多个频道,接收匹配的消息PSUBSCRIBE news_*
PUNSUBSCRIBE取消模式订阅,停止接收通过模式匹配的消息PUNSUBSCRIBE news_*

发布订阅流程

假设我们有一个简单的消息系统,其中有一个发布者(Publisher)和两个订阅者(Subscriber_A和Subscriber_B)。发布者将消息发布到一个名为“news_channel”的频道,两个订阅者分别订阅了这个频道,以接收发布的新闻消息。

  1. 发布者发布消息
    发布者将一条新闻消息发布到名为“news_channel”的频道。使用PUBLISH命令可以完成这个操作:
    PUBLISH news_channel "新闻:该吃瓜了!"
  2. 订阅者A订阅频道
    订阅者A通过使用SUBSCRIBE命令来订阅“news_channel”频道,以便接收来自发布者的消息:
    SUBSCRIBE news_channel
  3. 订阅者B订阅频道
    同样地,订阅者B也通过SUBSCRIBE命令来订阅“news_channel”频道:
    SUBSCRIBE news_channel
  4. 发布者发布更多消息
    发布者可以继续发布更多的消息到“news_channel”频道:
    PUBLISH news_channel "震惊:cxk塌房啦!"
  5. 订阅者接收消息
    订阅者A和订阅者B都将在接收到消息后显示消息内容。他们都能看到发布者发布的消息。
  6. 取消订阅
    如果订阅者不再想接收消息,可以通过使用UNSUBSCRIBE命令取消订阅:
    UNSUBSCRIBE news_channel
发布消息
订阅频道
订阅频道
传递消息
传递消息
发布者
Redis服务器
订阅者A
订阅者B

发布订阅的优缺点

优点:

优点描述
简单的实时通信适用于需要实时传递消息的场景,如实时监控、聊天应用等
解耦发布者和订阅者发布者和订阅者之间的解耦降低了系统复杂性
广播消息一条消息可以同时传递给所有订阅了相应频道的订阅者
简单的模式订阅支持通过通配符订阅多个频道,方便实现特定模式下的消息订阅
低延迟Redis的内存数据库特性使得发布-订阅模式具有低延迟

缺点:

缺点描述
消息的可靠性和持久性不保证消息的可靠传递和持久性存储,需要额外的机制
顺序性问题无法保证消息的传递顺序,订阅者接收消息的顺序可能不一致
消息堆积和延迟订阅者处理消息速度不足时,可能导致消息堆积和延迟
扩展性问题随着订阅者数量增加,Redis服务器负载可能增加,需要考虑扩展性
单一服务器限制仅在单个Redis服务器内工作,不适用于分布式消息队列
无法重播历史消息订阅者只能接收自订阅后发布的消息,无法获取历史消息
http://www.lryc.cn/news/132493.html

相关文章:

  • 链表2-两两交换链表中的节点删除链表的倒数第N个节点链表相交环形链表II
  • 数据结构之并查集
  • [element-ui] el-date-picker a-range-picker type=“daterange“ rules 校验
  • Dockers搭建个人网盘、私有仓库,Dockerfile制作Nginx、Lamp镜像
  • 2023 CCPC 华为云计算挑战赛 hdu7401 流量监控(树形dp)
  • 01.Django入门
  • 亿赛通电子文档安全管理系统任意文件上传漏洞(2023-HW)
  • docker限制容器日志大小
  • 底层驱动实现数码管显示温湿度数值功能
  • 03架构管理之测试管理
  • 30、devtools 依赖关于自动重启(自动加载页面)的知识
  • ES6 Promise/Async/Await使用
  • Word中对象方法(Methods)的理解及示例(上)
  • AutoDev 1.1.3 登场,个性化 AI 辅助:私有化大模型、自主设计 prompt、定义独特规则...
  • win11 python 调用edge调试过程
  • DS-排序回顾
  • clion软件ide的安装和环境配置@ubuntu
  • Cpp学习——类与对象3
  • 回归预测 | MATLAB实现PSO-RBF粒子群优化算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图)
  • ahooks.js:一款强大的React Hooks库及其API使用教程(四)
  • FOSSASIA Summit 2023 - 开源亚洲行
  • QT 基本对话框
  • ​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.
  • Azure静态网站托管
  • LeetCode 热题 100(五):54. 螺旋矩阵、234. 回文链表、21. 合并两个有序链表
  • 常用消息中间件介绍
  • 装饰器读取不到被装饰函数的参数-已解决
  • python爬虫爬取中关村在线电脑以及参数数据
  • chatGPT-对话爱因斯坦
  • 嵌入式软件开发中的数据类型转换