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

11.消息队列

消息队列

消息队列: 把要传输的数据放在队列中,从而实现应用之间的数据交换

常用功能: 可以实现多个应用系统之间的解耦,异步,削峰/限流等

常用的消息队列应用: Kafka,RabbitMQ,Redis

消息队列分为两种

  • 生产者/消费者模式: Producer/Consumer
  • 发布者/订阅者模式: Publisher/Subscriber

1. 生产者消费者模式

1.1 模式说明

生产者消费者模式下,多个消费者同时监听一个频道(redis用队列实现),但是生产者产生的一个消息只能被最先抢到消息的一个消费者消费一次,队列中的消息由可以多个生产者写入,也可以有不同的消费者取出进行消费处理.此模式应用广泛

1.2 生产者生成消息

# 从管道的左侧写入
127.0.0.1:6379> lpush channel1 msg1
(integer) 1
127.0.0.1:6379> lpush channel1 msg2
(integer) 2
127.0.0.1:6379> lpush channel1 msg3
(integer) 3127.0.0.1:6379> type channel1
list

1.3 获取所有消息

127.0.0.1:6379> lrange channel1 0 -1
1) "msg3"
2) "msg2"
3) "msg1"

1.4 消费者消费消息

# 基于实现消息队列的先进先出原则,从管道的右侧消费
127.0.0.1:6379> rpop channel1
"msg1"
127.0.0.1:6379> rpop channel1
"msg2"
127.0.0.1:6379> rpop channel1
"msg3"
127.0.0.1:6379> rpop channel1
(nil)

1.5 验证队列消息消费完成

# 验证队列中的消息全部消费完成
127.0.0.1:6379> lrange channel1 0 -1
(empty array)

2. 发布者订阅模式

2.1 模式说明

在发布者订阅者Publisher/Subscriber模式下,发布者Publisher将消息发布到指定的频道channel,事先监听此channel的一个或多个订阅者Subscriber都会收到相同的消息。即一个消息可以由多个订阅者获取到 对于社交应用中的群聊、群发、群公告等场景适用于此模式

2.2 订阅者订阅频道

# 另打开一个终端当作订阅者 (也可以多开几个终端当订阅者)
127.0.0.1:6379> subscribe channel2
1) "subscribe"
2) "channel2"
3) (integer) 1
Reading messages... (press Ctrl-C to quit or any key to type command)

2.3 发布者发布消息

# 发布者发布信息到指定频道
127.0.0.1:6379> publish channel2 msg1
(integer) 1  # 订阅者个数

2.4 各个订阅者都能收到消息

# 在另一个打开的终端查看
127.0.0.1:6379> subscribe channel2
1) "subscribe"
2) "channel2"
3) (integer) 1
1) "message"
2) "channel2"
3) "msg1"
Reading messages... (press Ctrl-C to quit or any key to type command)

2.5 订阅多个频道

127.0.0.1:6379> SUBSCRIBE channel2 channel22

2.6 订阅所有频道

127.0.0.1:6379> PSUBSCRIBE *

2.7 订阅匹配的频道

127.0.0.1:6379> PSUBSCRIBE chann*

2.8 取消订阅频道

127.0.0.1:6379(subscribed mode)> unsubscribe channel2
1) "unsubscribe"
2) "channel2"
3) (integer) 0
http://www.dtcms.com/a/313178.html

相关文章:

  • 计算机视觉CS231n学习(2)
  • 从马武寨穿越关山
  • ICCV 2025 | EPD-Solver:西湖大学发布并行加速扩散采样算法
  • p5.js 用 beginGeometry () 和 endGeometry () 打造自定义 3D 模型
  • 控制建模matlab练习06:比例积分控制-②PI控制器
  • 达梦数据库联机备份和脱机备份的区别
  • Centos7 安装Python3.11
  • 【Linux系统编程】进程信号
  • leecode2958 最多K个重复元素的最长子数组
  • 解决飞书文档中PDF文档禁止下载的问题
  • 提升工作效率的利器:Qwen3 大语言模型
  • Python 程序设计讲义(60):Python 的函数——递归函数
  • 出现OOM怎么排查
  • 研报复现|史蒂夫·路佛价值选股法则
  • linux ollama模型缓存位置变更
  • 音视频学习(四十九):音频有损压缩
  • 机器学习之决策树(二)
  • 解决PyCharm的Terminal终端conda环境默认为base的问题
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-57,(知识点:电感的选型,电感参数,电感量,饱和电流,直流电阻,自谐振频率)
  • 可视化AI应用构建工具(Dyad)
  • 【内容规范】关于标题中【】标记的使用说明
  • 2.0 vue工程项目的创建
  • TableCurve 3D:自动化曲面拟合与方程发现
  • Steam饥荒联机版多人服务器搭建全解析 -- 阿里云Linux系统构建云服务器
  • Flutter dart控制流程
  • Shell脚本-变量的定义规则
  • 【DL学习笔记】深入学习tenser
  • electron-多线程
  • JDBC核心技术与预编译SQL实战
  • 计算机网络:如何将一个C类网络划分成两个子网