Redis实战——消息队列

news2024/12/26 22:13:24

目录

1. 什么是消息队列?

2. 基于List结构模拟消息队列

3. 基于PubSub的消息队列

4. 基于Stream的消息队列

 4.1 基于Stream的单消费者模式

4.2 基于Stream的消息队列-消费者组

1. 什么是消息队列?

字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色:

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

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

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

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

(1)List结构:基于List结构模拟消息队列

(2)PubSub:基本的点对点消息模型

(3)Stream:比较完善的消息队列模型

2. 基于List结构模拟消息队列

基于List的队列,很简单,就是使用LPUSH 结合 RPOP的组合来实现队列的效果。之前学习List类型结构时就已经学过了。

不过要注意的是,当队列中没有消息时RPOP或LPOP操作会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息。因此这里应该使用BRPOP或者BLPOP来实现阻塞效果。

这种实现方式较为简单,有自己的优点和缺点。

优点:

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

        基于Redis的持久化机制,数据安全性有保证

        可以满足消息有序性

缺点:

        无法避免消息丢失

        只支持单消费者

3. 基于PubSub的消息队列

PubSub(发布订阅)Redis2.0版本引入的消息传递模型。顾名思义,消费者可以订阅一个或多个channel(频道),生产者向对应channel发送消息后,所有订阅者都能收到相关消息。

它的特点是,不同的消费者可以订阅不同的频道,支持多个消费者进行消费。

语法:

SUBSCRIBE channel [channel] :订阅一个或多个频道

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

PSUBSCRIBE pattern[pattern] :订阅与pattern格式匹配的所有频道 

如图所示,上面是生产者,下面是消费者:

这种方式的优点在于可以实现多消费,但同样也有很多缺陷

包括:不支持数据持久化 、无法避免消息丢失(只能读取到最新消息)、消息堆积有上限,超出时数据丢失(因为是存储在内存里) 

4. 基于Stream的消息队列

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

 4.1 基于Stream的单消费者模式

这里主要有两个命令:

1. 发送消息的命令(XAdd):

例如:

 users是队列名称 ,*代表自动生成队列ID,name jack age 21就是消息

2. 读取消息的方式之一:XREAD

这里重点看ID部分,0代表从第一个读,$代表读最新消息也就是最后一个。

例如,使用XREAD读取第一个消息

在业务开发中,我们可以循环的调用XREAD阻塞方式来查询最新消息,从而实现持续监听队列的效果,伪代码如下 :

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

基于STREAM类型消息队列的XREAD命令特点:

消息可回溯

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

可以阻塞读取

有消息漏读的风险

4.2 基于Stream的消息队列-消费者组

 消费者组(Consumer Group):将多个消费者划分到一个组中,监听同一个队列。具备下列特点:

通俗的讲,就是多个消费者在一个队列中处于竞争关系,多个消费者来处理队列消息,加快消息处理的速度 。而且消费者组会给消息加上一个标识,纪录最新读到的消息。如果中途消息处理完未提交,消息还会进入pending状态,进入pending-list中,不会照成数据的丢失

语法:

创建消费者组

key:队列名称
groupName:消费者组名称
ID:起始ID标示,$代表队列中最后一个消息,0则代表队列中第一个消息
MKSTREAM:队列不存在时自动创建队列 

 删除指定的消费者组(ket是队列,groupname是组名)

XGROUP DESTORY key groupName

 给指定的消费者组添加消费者(consumername是消费者名)

XGROUP CREATECONSUMER key groupname consumername

 删除消费者组中的指定消费者 

XGROUP DELCONSUMER key groupname consumername

从消费者组读取消息

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]

group:消费组名称
consumer:消费者名称,如果消费者不存在,会自动创建一个消费者
count:本次查询的最大数量
BLOCK milliseconds:当没有消息时最长等待时间
NOACK:无需手动ACK,获取到消息后自动确认
STREAMS key:指定队列名称
ID:获取消息的起始ID

这里注意:ID不是只有0和$符号了。

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


如果消费者已经获取消息但没提交消息:根据指定id从pending-list中获取已消费但未确认的消息,例如0,是从pending-list中的第一个消息开始。

查看Pending-List中的消息:

获取 Pending-List中未读的消息并提交。

消费者监听消息的基本思路(伪代码):

最后来个小对比:

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

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

相关文章

学习参数化计算优化风扇定位step by step

一、写在前面 本教程的目的是演示ANSYS Icepak的参数和优化功能。假定读者已经熟悉ANSYS Icepak界面,但是缺乏实战经验。 在这个案例中,读者可以掌握: 1、使用Network网络热阻Block来模拟IC芯片封装模型。 2、将变量定义为参数并通过参数…

算法竞赛入门【码蹄集进阶塔335题】(MT2226-2250)

算法竞赛入门【码蹄集进阶塔335题】(MT2226-2250) 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2226-2250)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件?目录1. MT2226 36进制22. MT2227 36进制33. MT2228 36进制44.…

电商、线上教育、在线医疗等必备资质——ICP许可证 。

危中有机,疫情也概莫能外。一场突如其来的疫情,引发了消费、健康、办公、学习等领域的新变革,电商、短视频、游戏、线上教育、在线医疗、知识付费等“互联网”项目,再次迎来发展机遇。 然而,如果想要借助互联网进行经…

[附源码]Python计算机毕业设计大学生网上书店Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

type 与 interface

type 与 interface 官方文档是这么说的: For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you…

基于C#+SQL Server2008实现(WinForm)学生宿舍管理系统【100010029】

1 概述 本次课程设计是数据库课程设计,我选的是学生宿舍管理系统,功能块主要是宿舍管理、学生管理、出入登记和来访登记,目的在于将学生宿舍的管理实现信息化,监控学生宿舍的情况防止意外发生。 课程设计任务的需求分析 2.1设计…

01算法的概念

开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念,算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博…

Day828.多线程原语:管程 -Java 并发编程实战

多线程原语:管程 Hi,我是阿昌,今天学习记录的是关于多线程原语:管程的内容。 并发编程这个技术领域已经发展了半个世纪了,相关的理论和技术纷繁复杂。 那有没有一种核心技术可以很方便地解决的并发问题呢&#xff1…

JAVA毕业设计——基于SpringBoot的健身房管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/gym-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于SpringBoot的健身房管理系统(源代码数据库) 一、系统介绍 系统层次结构图如下: 管理员登录模块会员管理模块教练管理模块课程管理模块器材…

基于Java+SQL Server2000实现(界面)学生选课管理系统【100010025】

学生选课管理系统 二、需求描述 本系统是一个单机版的小型的学生选课管理系统,在本系统中,开发了一个面向管理员、学生和教师这三个对象的教务平台,对学生提供的服务有登录、选课、、修改登录密码、和查询成绩这几个服务,所选课…

第二季5:配置视频捕获(step3:VI部分)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 本文将详细介绍博文第二季3:sample_venc.c的整体分析提及的“配置视频捕获”。 该部分主要涉及以下步骤: 5、配置MIPI6、初始化ISP7、运行ISP线程8、配置开启VI 设备捕…

Mybatis 参数处理器注入配置解析流程

参数处理器的作用 Mybatis作为一个ORM框架, 其最原始的本质就是JDBC,对于JDBC的使用步骤中有2步和参数处理器有关, 就是给预处理器PreparedStatement 设置参数以及通过结果集获取字段值。 这两个步骤在Mybatis中已经成为框架底层逻辑流程&am…

【K8S系列】第十一讲:包管理神器-Helm

目录 序言 1.背景介绍 1.1 k8s 简单介绍 1.2 k8s部署挑战 2.Helm 2.1 Helm介绍 2.1 使用优势: 3.Helm模块 3.1 Helm 3.1.1 安装Helm 3.2 Chart 3.2.1 Chart 基本介绍 3.2.2 Chart目录结构 3.3 Repoistory 3.4 Config 3.5 Release 4.投票 序言 当…

Windows及Linux系统查找某个端口和文件被占用

概述 开发中很常见的问题,每次遇到这个问题,都是去Google搜索,不一定能搜到满意的答案,有点耗时,故记录一下,得到本文。 端口被占用,导致IDEA启动应用失败。又或者某个文件被某个未知的应用使…

c#入门-抽象类

抽象类 有些类存在的意义就是为了让别的类继承。自己本身不应该具有实例。例如 class 单位 {public int 生命; } class 建筑 : 单位 {public int 护甲; } class 英雄 : 单位 {public int 护盾; } class 小兵 : 单位 {public int 经验; }可以使用abstract把他声明为抽象类。 抽…

Linux查找find命令全面剖析

Linux查找find命令全面剖析 1. 文件查找 在文件系统上查找符合条件的文件 1.1 简述 locate 命令 非实时查找(数据库查找) 依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务) 手动更新数据库(updatedb),索引构建过程需要遍历整…

【物理应用】基于Matlab模拟13自由度摩托车模型

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Python使用Selenium WebDriver的入门介绍及安装教程

Selenium WebDriver 入门一、什么是Selenium WebDriver二、安装Selenium WebDriver2.1 安装selenium类库2.2 安装浏览器驱动2.3 配置环境变量三、编写第一个Selenium脚本一、什么是Selenium WebDriver WebDriver 以本地化方式驱动浏览器,就像用户在本地或使用 Sele…

[附源码]Nodejs计算机毕业设计基于Java网上玩具商店Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

R语言基于协方差的SEM结构方程模型中的拟合指数

在实践中, 因子负载较低(或测量质量较差)的模型的拟合指数要好于因子负载较高的模型。 最近我们被客户要求撰写关于SEM的研究报告,包括一些图形和统计输出。例如,如果两个模型具有相同的错误指定级别,并且…