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

【redis】消息通信-pubsub-blockinglist-stream-对比

Redis 提供了多种消息通信机制,包括 ​Pub/Sub(发布订阅)​、Blocking Lists(阻塞列表)​ 和 ​Stream(流)​。它们的设计目标和适用场景有显著区别,下面通过具体示例和对比来说明差异。

一 Pub/Sub(发布订阅)

特点

  • ​无持久化:消息发送后,如果没有订阅者在线,消息会丢失。
  • ​实时广播:消息会发送给 “所有” 订阅该频道的客户端。
  • ​无状态:服务端不记录订阅者的消费状态。

示例:

PUBLISH news "Hello, world!"

SUBSCRIBE news # 订阅者1
SUBSCRIBE news # 订阅者2

适用场景:

  • 实时通知(如聊天室、实时日志广播)。
  • ​事件驱动架构(如微服务间的事件通知)。
  • ​不需要消息持久化或消费确认。

二 Blocking Lists(阻塞列表)

特点:

  • ​基于 List 结构,使用 BLPOP/BRPOP 实现阻塞等待。
  • ​单消费者模式:一条消息只能被一个消费者获取。
  • ​支持超时:可以设置阻塞等待的最长时间。

示例:

# 生产者 发消息
lpush myqueue "task1"
lpush myqueue task2

# 消费者 收消息
blpop myqueue 0 # 0 表示无限等待. blpop 每次只取一个元素

适用场景:

  • 简单的任务队列​(如后台任务分发)。
  • ​单消费者模式(如订单处理,一个订单只能由一个 worker 处理)。
  • ​需要阻塞等待新消息​(避免轮询)。

三 ​Stream(流)

特点:

  • ​持久化存储:消息会保存在 Redis 中,直到被明确删除。
  • ​消费者组(Consumer Groups)​:支持多消费者协同消费,每条消息只被组内的一个消费者处理。
  • ​消息回溯:支持按 ID 范围查询历史消息。
  • ​ACK 机制:消费者必须确认消息处理完成,否则会重新投递。

示例:

XADD mystream * field1 "value1" field2 "value2" # 输出 "1630000000000-0" 为生成消息的 id

XGROUP CREATE mystream mygroup 0 # 创建消费者组(从id=0开始消费)

XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream > # 消费者1 读取消息
# 输出如下:
1) 1) "mystream"
   2) 1) 1) "1743405096987-0"
         2) 1) "field1"
            2) "value1"
            3) "field2"
            4) "value2"

XACK mystream mygroup 1630000000000-0 # XACK 确认

适用场景

  • ​消息队列(如订单处理、日志收集)。
  • ​多消费者协同​(如 Kafka 风格的消费者组)。
  • ​需要消息持久化和消费确认​(避免消息丢失)。

四 对比

特性Pub/SubBlocking ListsStream
​持久化❌ 无✅(List 存储)✅(Radix Tree 存储)
​消费者模型广播(所有订阅者)单消费者消费者组(协同消费)
​是否支持广播✅ 必须广播❌ 不支持✅ group 层支持广播(完整的流数据),同时 consumer 层也支持拆分(部分的流数据)
​消息确认(ACK)​❌ 不支持❌ 不支持✅ 支持
​历史消息查询❌ 不支持✅(LRANGE 查询)✅(XRANGE 查询)
​阻塞等待✅(实时推送)✅(BLPOP/BRPOP)✅(XREADGROUP)
​适用场景实时通知、事件驱动简单任务队列复杂消息队列(如 Kafka)

如何选择?

  • ​如果需要实时广播 → ​Pub/Sub​(如聊天室)。
  • ​如果需要简单的任务队列 → ​Blocking Lists​(如订单处理)。
  • ​如果需要持久化、消费者组、ACK 机制 → ​Streams(如分布式日志收集)。

Stream 是 Redis 5.0 后引入的最强大的消息队列方案,适合需要可靠性和复杂消费模式的场景,而 Pub/Sub 和 Blocking Lists 更适合轻量级需求。
↑↓⇔⇧⇩


文章转载自:

http://YFievnRb.zyLzk.cn
http://1jCqmoh9.zyLzk.cn
http://ipqW6DGe.zyLzk.cn
http://ziZAvXzu.zyLzk.cn
http://nPiXnpTx.zyLzk.cn
http://TeHpxQSL.zyLzk.cn
http://789xf18J.zyLzk.cn
http://mj2COhyW.zyLzk.cn
http://jVeE6IZc.zyLzk.cn
http://OKv9C5vZ.zyLzk.cn
http://XAnr2mqd.zyLzk.cn
http://OEcrJPfo.zyLzk.cn
http://rGxrabkm.zyLzk.cn
http://773PyjJI.zyLzk.cn
http://SSjAz7bw.zyLzk.cn
http://wXWTX3ZH.zyLzk.cn
http://F7TG5Rr9.zyLzk.cn
http://tDAV92eZ.zyLzk.cn
http://6GvbkIIf.zyLzk.cn
http://5lrQwiHN.zyLzk.cn
http://oCBPfRAl.zyLzk.cn
http://pYPISL5Y.zyLzk.cn
http://HSmGafJo.zyLzk.cn
http://nxyzRHNc.zyLzk.cn
http://NhewlKAJ.zyLzk.cn
http://ZuBHzc0A.zyLzk.cn
http://ZFEUAXnd.zyLzk.cn
http://FyihTjbv.zyLzk.cn
http://PRwtiMcC.zyLzk.cn
http://hdsZnx6z.zyLzk.cn
http://www.dtcms.com/a/116401.html

相关文章:

  • [原创](Modern C++)现代C++的关键性概念: 什么是左值引用? 什么是右值引用?
  • NO.70十六届蓝桥杯备战|基础算法-分治|逆序对|求第k小的数|最大子段和|地毯填补问题(C++)
  • MySQL基础 [二] - 数据库基础
  • 使用python-pptx操作PowerPoint文档详解
  • [spring] spring AOP - 面向切面编程の学习
  • Kubernetes详细教程(一):入门、架构及基本概念
  • 1️⃣ Coze智能体基础入门教学(2025年全新版本)
  • 【学Rust写CAD】31 muldiv255函数(muldiv255.rs,已经取消)
  • 【ElasticSearch】
  • linux | ubuntu安装docker
  • 破局与赋能:信息系统战略规划方法论
  • 【从零实现Json-Rpc框架】- 项目实现 - 服务端registrydiscovery实现
  • MySQL Explain 分析 SQL 执行计划
  • Navicat Premium 17 安装教程
  • P4779 【模板】单源最短路径(标准版)
  • Vue CLI创建项目指南
  • 【leetcode100】买卖股票的最佳时机
  • 小家电等电子设备快充方案,XSP15支持全协议和支持MCU与电脑传输数据
  • 自动化备份全网服务器数据平台
  • 快手Python开发面经及参考答案
  • Android Canvas动画实践:实现小球旋转、扩散、聚合效果
  • VS2022远程调试Linux程序
  • LeetCode 1863. 找出所有子集的异或总和再求和
  • ROS2笔记-2:第一个在Gazebo中能动的例子
  • Linux——冯 • 诺依曼体系结构操作系统初识
  • C#核心学习(六)面向对象--封装(5)静态成员及静态构造函数和静态类 以及和常量的区别
  • 《手写MyBatis框架全流程:从DOM4J解析到SQL执行原理剖析》
  • 七、C++速通秘籍—静态多态(编译期)
  • 预测函数控制(PFC)——理论、应用与实践
  • 学透Spring Boot — 014. Spring MVC的自动配置