Redis 消息队列

news2024/9/25 8:44:49

认识消息队列

消息队列(Message Queue)字面意思就是存放消息的队列,最简单的消息队列模型包括 3 个角色

  • 消息队列:存储和管理消息,也被称为消息代理(Message Broker)

  • 生产者:发送消息到消息队列

  • 消费者:从消息队列获取消息并处理

优点:结束耦合,异步操作

Redis 提供了三种不同的方式来实现消息队列

  • list 结构:基于 List 结构模拟消息队列

  • PubSub:基本的点对点消息模型

  • Stream:比较完善的消息队列模型

List

list 数据结构是一个双向链表,很容易模拟出队列效果,队列的人口和出口不在一边,因此我们可以利用,LPUSH 结合 RPOP,或者RPUSH 结合 LPOP 来实现,不过要注意的是,当消息队列中没有消息时 RPOP 或者 LPOP 操作会返回 null ,并不像 JVM 的阻塞队列那样会阻塞并等待消息,因此这里应该使用 BRPOP 或者 BLPOP 来实现阻塞效果,他是在 JVM 以外的独立存储,所以没有存储上限的问题,第二数据安全,redis 支持数据持久化

优点

  • 利用 Redis 存储,不受限于 JVM 内存上限

  • 基于 Redis 的持久化机制,数据安全性有暴政

  • 可以满足消息有序性

缺点

  • 无法避免消息丢失

  • 只支持单个消费者

PubSub

是 Redis 2.0 版本引入的消息传递模型,顾名思义,消费者可以订阅一个或者多个 channel ,生产者向对应 channel 发送消息后,所有订阅者都能收到相关的消息

  • UBSCRIBE channel [channel] : 订阅一个或者多个频道

  • PUBLISH channel msg : 向一个频道发送消息

  • PSUBSCRIBE pattern(通配符) [pattern] : 订阅与 pattern 格式匹配的所有频道 , redis 支持的通配符 ?模糊单个字符 * 模糊一个或者多个字符 [ab] 指定模糊字符

优点

  • 采用发布订阅模型,支持多生产,多消费

缺点

  • 不支持数据持久化

  • 无法避免消息丢失

  • 消息堆积有上限,超时时数据会丢失

Stream

是 Redis 5.0 引入的一种新数据类型,可以实现一个功能非常完善的消息队列

注意:当我们指定起始 ID 为 $ 时,代表读取最新消息,如果我们处理一条消息的过程中,又有超过 1 条以上的消息达到队列,则下次获取的时也只能获取到最新的一条,会出现漏读消息的情况

特点

  • 消息可回溯

  • 一个消息可以被多个消费者读取

  • 可以阻塞读取

  • 有消息漏读的风险

消费者组

(Consumer Group)将多个消费者划分到一个组中,监听同一列队

特点

  • 消息分流:列队中的消息会分流给组内的不同消费者,而不是重复消费,从而加快消息处理了的速度

  • 消息标示:消费者组会维护一个标示记录最后一个被处理的消息,哪怕消费者宕机重启,还会从标示之后读取消息,确保每一个消息都会被消费,不会出现漏掉消息的情况

  • 消息确认:消费者获取消息之后,消息处于一个 pending 状态,并存入一个 pending-list 。当处理完成后,需要通过 XACK 来确认消息,标记消费已处理,才会从 pending-list 中移除

创建消费者组

XGROUP CREATE key groupName ID [MKSTREAM]

  • key 队列名称

  • groupName 消费者组的名称

  • ID 起始 ID 标示,$ 代表队列中最后一条消息,0 则代表队列中第一个消息

  • MKSTREAM 列队不存在时自动创建队列

其他命令

从消费者组读取消息

  • group 消费组名称

  • consumer 消费者名称,如果消费者不存在,会自动创建一个消费者

  • count 本次查询的最大数量

  • BLOCK milliseconds 当没有消息时最大等待时长 (毫秒)

  • NOACK 无需手动 ACK ,获取到消息后自动确认 ,一般不建议设置

  • STREAMS key 指定队列名称

  • ID 获取消息的起始 ID

    • > 从下一个未消费的消息开始

    • 其他,根据指定的 id 从 pending-list 中获取已消费但是未确认的消息,例如 0 ,是从 pending-list 中的第一个消息开始

XACK

要确认的消息

语法 XACK key group ID [ID ...]

总结

STREAM 类型消息队列的 XREADGROUP 命令特点

  • 消息可回溯

  • 可以多消费者争抢消息,加快消息速度

  • 可以阻塞读取

  • 没有消息漏读的风险

  • 有消息确认机制,确保消息至少被消费一次

    ListPubSubStream
    消息持久化支持不支持支持
    阻塞读取支持支持支持
    消息堆积处理受限于内存空间,可以利用多消费者加速处理受限于消费者缓冲区受限于队列长度,可以利用消费者组来提高消费速度,减少堆积
    消息确认机制不支持不支持支持
    消息回溯不支持不支持支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…

【day20240925】常见数据集科普

文章目录 常见数据集Fashion-MNISTCIFAR-10CIFAR-100IMDbTiny Imagenet 常见数据集 Fashion-MNIST CIFAR-10 CIFAR-100 IMDb Tiny-ImageNet Fashion-MNIST Fashion-MNIST数据集涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。它的大小、格式和训练集 / 测试集划分与原…

pycharm 使用 translation 插件通过openai进行翻译

pycharm 使用 translation 插件通过openai进行翻译 1. 安装插件2. 配置插件3. 翻译 1. 安装插件 2. 配置插件 3. 翻译 调用 openai 时使用的提示词如下&#xff1a; <|im_start|>system\nYou are a translation engine that can only translate text and cannot interpr…

WebSocket实现在线聊天室

项目实现源码&#xff1a; 前端源码 后端源码 1.常见的消息推送方式 1.1 轮询 1.1.1 轮询的概念 客户端以固定的事件间隔&#xff08;例如每秒或几分钟&#xff09;向服务器发送HTTP请求&#xff0c;服务器收到请求后&#xff0c;处理请求并返回数据给客户端 轮询具体实现htt…

Redis的一些数据类型(一)

&#xff08;一&#xff09;数据类型 我们说redis是key value键值对的方式存储数据&#xff0c;key是字符串&#xff0c;而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含&#xff0c;String&#xff0c;hash&#xff0c;list&#xff0c;set和zest但…

SegFormer网络结构的学习和重构

因为太多的博客并没有深入理解,本文是自己学习后加入自己深入理解的总结记录&#xff0c;方便自己以后查看。 segformer中encoder、decoder的详解。 学习前言 一起来学习Segformer的原理,如果有用的话&#xff0c;请记得点赞关注哦。 一、Segformer的网络结构图 网络结构&…

反转字符串 II--力扣541

反转字符串 II 题目思路代码 题目 思路 本题的关键在于理解每隔 2k 个字符的前 k 个字符进行反转&#xff0c;剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符。并且剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 让i每次跳2k&#xff0c;成为每一次…

Xshell 连接 VMware虚拟机操作 截图和使用

Xshell 连接 VMware虚拟机操作 文章目录 Xshell 连接 VMware虚拟机操作一、本机环境截图1.1配置 Xshell环境截图VWware 配置环境截图最后下载地址 一、本机环境截图 1.1配置 Xshell环境截图 VWware 配置环境截图 最后 下载地址 vmware https://www.vmware.com/ VMware总部位于…

电场(electric-field)

图中&#xff1a; Q 产生电场的正电荷&#xff08;可正可负&#xff0c;这里用正举例&#xff09;q 试验电荷&#xff0c;正电荷&#xff08;习惯上用正电荷&#xff09;p 试验电荷所在的位置&#xff08;即要测的电场强度的位置&#xff09;r 为电荷间的距离 r ^ \widehat{r}…

广州电影产业博览交易会将于本周五开始

“影动广州绽放世界”广州电影产业博览交易会由广州市人民政府主办&#xff0c;广州市委宣传部承办&#xff0c;将在广交会展馆A区4.2及5.2馆启幕。本届广州影博会聚焦电影产业交易、科技创新和消费市场&#xff0c;链接国内外电影资源&#xff0c;活动内容丰富。设置电影主题展…

MySQL Performance Schema 详解及运行时配置优化

引言 MySQL 的 Performance Schema 是一套性能监控与诊断工具&#xff0c;帮助开发者和数据库管理员收集、分析 MySQL 实例的运行状态&#xff0c;找出性能瓶颈并进行优化。通过 Performance Schema&#xff0c;我们能够监控不同的内部事件、线程、会话、语句执行等关键性能指…

Python批量合并365个工作表的2种方法

一、引言 小明刚进入到新公司&#xff0c;就被委以重任&#xff1a;将365个Excel文件中的英文表头修改为中文。传统方法是逐一打开每个文件&#xff0c;手动修改标题&#xff0c;然后保存&#xff0c;最后再合并。这种方法不仅耗时耗力&#xff0c;还容易出错。如果用Python就…

[大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成

MoRAG--Multi-Fusion Retrieval Augmented Generation for Human Motion KS Shashank, S Maheshwari, RK Sarvadevabhatla - arXiv preprint arXiv:2409.12140, 2024 MoRAG - 基于多部分融合的检索增强型人体动作生成 1. 目录 MoRAG--Multi-Fusion Retrieval Augmented Generat…

Redis:缓存

为什么要理解Redis缓存问题 在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的环节。所以&#xff0c;就需要使用redis做一个缓冲操作&#xff0c;让请求先访问到redis&#xff0c;而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。 当…

【MySql】在ubuntu下安装MySql数据库

目录 查看操作系统版本 添加 MySql APT源 访问下载页面并下载发布包 安装发布包 执行安装命令 从MySql APT源更新包信息 安装MySql 执行安装命令 查看MySql状态 开启自启动 登录MySql 查看操作系统版本 rootVM-24-2-ubuntu:~# lsb_release -a No LSB modules are ava…

软考高级:需求工程- 4+1 视图 AI 解读

这几个术语常见于软件架构的描述中&#xff0c;它们分别代表软件系统的不同角度或视角。为了更好理解它们&#xff0c;我们可以把软件系统想象成一个公司&#xff0c;每个视图就像从不同角度观察这个公司的运作方式。 生活化例子 想象你在经营一家餐馆&#xff1a; 逻辑视图…

SSM+Vue共享单车管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

C++网络编程之网络模型

概述 所谓网络模型&#xff0c;是指一组定义了网络通信功能和行为的规则和标准。这些模型通过将网络通信功能分解成不同的层次&#xff0c;使得网络通信更加模块化&#xff0c;也更易于理解和实施。每一层都有其特定的功能&#xff0c;通过层与层之间的交互&#xff0c;确保数据…

await命令的用法

正常情况下&#xff0c;await 命令后面是一个 Promise 对象&#xff0c;返回值是该 Promise 对象的结果。如果不是 Promise 对象&#xff0c;就会进行自动转换&#xff0c;使用 Promise.resolve()&#xff0c;就直接返回对应的值 await 命令后面的 Promise 对象如果变为 reject…

方法部分 学习

方法是程序中最小的执行单元 方法的定义调用 public static void 方法名&#xff08;&#xff09;{ 方法体 } 写在main方法外面&#xff0c;在main函数里面直接调用带参数&#xff1a;public static void 方法名&#xff08;int num1 &#xff0c; int num2&am…