Redis消息队列

news2024/10/7 3:27:01

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

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

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

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

List结构

Redis的list数据结构是一个双向链表,很容易模拟出队列效果。

队列是入口和出口不在一边,因此我们可以利用:LPUSH 结合 RPOP、或者 RPUSH 结合 LPOP来实现。

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

优点

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

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

可以满足消息有序性

缺点

无法避免消息丢失

只支持单消费者

PubSub

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

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

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

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

优点

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

缺点

不支持数据持久化

无法避免消息丢失

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

Stream

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

发送消息的命令:

读取消息的方式之一:XREAD 

XREAD阻塞方式,读取最新的消息: 

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

特点

消息可回溯

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

可以阻塞读取

有消息漏读的风险

基于stream的消息队列——消费者组

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

消息分流

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

消息标示

消费者组会维护一个标示,记录最后一个被处理的消息,哪怕消费者宕机重启,还会从标示之后读取消息。确保每一个消息都会被消费

消息确认

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

常用命令

创建消费者组:

XGROUP CREATE  key groupName ID [MKSTREAM]

key:队列名称

groupName:消费者组名称

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

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

# 删除指定的消费者组

XGROUP DESTORY key groupName

# 给指定的消费者组添加消费者

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从pending-list中获取已消费但未确认的消息,例如0,是从pending-list中的第一个消息开始

 特点

消息可回溯

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

可以阻塞读取

没有消息漏读的风险

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

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

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

相关文章

【hello Linux】线程概念

目录 1. 线程概念的铺设 2. Linux线程概念 2.1 什么是线程 2.2 线程的优点 2.3 线程的缺点 2.4 线程异常 2.5 线程用途 3. Linux进程VS线程 4. Linux线程控制 4.1 POSIX线程库 4.2 创建线程 4.3 进程ID和线程ID 4.4 线程终止 4.5 线程等待 4.6 分离线程 Linux🌷 1…

FPGA时序约束(六)时序例外约束

系列文章目录 FPGA时序约束(一)基本概念入门及简单语法 FPGA时序约束(二)利用Quartus18对Altera进行时序约束 FPGA时序约束(三)时序约束基本路径的深入分析 FPGA时序约束(四)主时…

解除Word的编辑保护【简单版】

首先,我们遇到的情况是下图这样的: 点一下停止保护,是下图这样的: 开始解决: 第一种方式:另存为Word Xml 存好了, 打开如下图(我用VS打开的,最好找个能够格式化代码的编…

C++---区间DP---棋盘分割(每日一道算法2023.5.2)

注意事项: 涉及到"矩阵/二维前缀和"的一些知识,建议先理解那篇文章。 题目: 将一个 88 的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了…

echarts数据可视化-动态柱状图

效果如下: 此处用的echarts柱状图为:Axis Align with Tick 本文的要讨论的内容: 1、柱状图样式修改 2、多数据的缩放展示 柱状图样式修改 // 数据 const city reactive([{ value: 335, name: 长沙 },{ value: 310, name: 武汉 },{ value: …

C++类和对象 ——构造函数

C拷贝构造函数详解 什么是拷贝构造函数?拷贝构造函数的特征默认拷贝构造函数为什么需要显示定义构造函数?拷贝构造函数的调用场景什么时候不需要自己定义拷贝构造函数 什么是拷贝构造函数? 在现实生活中,拷贝构造函数就好像我们上…

Linux服务器 容器化部署新版Jenkins

安装Docker 先安装yml yum install -y yum-utils device-mapper-persistent-data lvm2设置加速镜像(阿里云镜像) sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装docker yum -y install d…

智慧工厂人员定位系统源码,实现对工厂内的人车、物、料等的精确定位

智慧工厂人员定位系统源码 技术架构:Java vue spring boot 系统概述: 采用UWB定位技术,通过在厂区内布设一定数量的定位基站,实时精确地定位员工、车辆、物品上微标签位置,零延时地将人、车、物的位置信息显示在工厂…

数据结构(六)—— 二叉树(2)遍历

文章目录 递归三要素一、深度优先遍历(前中后序)1.1 递归遍历1.1.1 前序(中左右)1.1.2 中序(左中右)1.1.3 后序(左右中) 1.2 迭代遍历1.2.1 前序1.2.2 后序1.2.3 中序 二、广度优先遍…

创建前、中、后序二叉树

创建前、中、后序二叉树 一、前序二叉树二、中序二叉树二、后序二叉树 一、前序二叉树 规则:根->左->右 前序遍历结果:ABCDEFGHK 二、中序二叉树 规则:左->根->右 中序遍历结果:ABCDEFG 二、后序二叉树 规则&a…

浅尝ChatGPT使用之Python字典嵌套排序

一、背景 所负责的项目从v1.0升级到v2.0之后,发送到kafka的Json数据字段顺序和内容有所改变, v1.0版本推送数据样例: {"name": "小王子","author": "安托万德圣-埃克苏佩里(1900-1944&#…

1.Hive基础

1.简介 作用:将结构化数据映射为一张表,并提供类sql功能 本质:将HQL转化成MapReduce程序 (1)Hive处理的数据存储在HDFS ​ (2)Hive分析数据底层的实现是MapReduce ​ (3&#x…

keil5固件库版本的工程建立

keil5固件库版本的工程建立 一、一个文件夹,如图再建立4个文件夹 二、准库往上图四个文件夹里粘贴 从标准库里面把Libraries里面的两个文件夹全部复制到新建文件夹Libraries里面 三、来对新建的Libraries里面的两个文件夹进行更改 STM32F10x_StdPeriph_Driver这个…

ajax与json

title: 15 ajax与json date: ‘2023-3-29’ 从一个例子开始 传统的方式进行前后端交互是什么样子的&#xff1f; <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <html> <head><me…

python cms建站教程:Wagtail建站(二、修改主页与自定义后台管理)

不得不说python的中文cms建站教程实在是太少了&#xff0c;直接用Django/Flask这样的框架从头开始写又实在是有点麻烦&#xff0c;自己摸索着写一点使用Wagtail建站的方法&#xff0c;仅供参考。Wagtail是一款基于Django框架的CMS建站工具&#xff0c;可以为你的网站提供一个比…

点赋科技:本地生活,如何开启复苏之路

目前&#xff0c;全球经历这场前所未有的疫情大流行已经结束&#xff0c;尽管许多国家和地区的经济和社会都受到了影响。然而&#xff0c;做好本地生活的复苏规划和推进&#xff0c;将有助于在疫情之后尽快走出经济低迷期&#xff0c;恢复社会活动和生活体验。点赋科技将阐述如…

初识MySQL数据库——“MySQL数据库”

各位CSDN的uu们你们好呀&#xff0c;小雅兰好久没有更文啦&#xff0c;确实是心有余而力不足&#xff0c;最近学习的内容太难了&#xff0c;这篇博客又是小雅兰的新专栏啦&#xff0c;主要介绍的是一些MySQL数据库的知识点&#xff0c;下面&#xff0c;让我们进入初识MySQL数据…

【黑马程序员 C++教程从0到1入门编程】【笔记8】 泛型编程——模板

https://www.bilibili.com/video/BV1et411b73Z?p167 C泛型编程是一种编程范式&#xff0c;它的核心思想是编写通用的代码&#xff0c;使得代码可以适用于多种不同的数据类型。 而模板是C中实现泛型编程的一种机制&#xff0c;它允许我们编写通用的代码模板&#xff0c;然后在需…

静态成员与友元函数

有缘 class Point {private:double x, y; public:Point(double xx, double yy) ;friend double Distance(Point &a, Point &b); };Point::Point(double xx, double yy) {x xx;y yy; }double Distance(Point &a, Point &b) {return sqrt(pow(a.x - b.x, 2) p…

【STM32CubeMX】F103定时中断

前言 本文记录下我学习STM32CubeMX时的流程&#xff0c;方便以后回忆。系统板是基于STM32F103C6T6。本章记录定时中断。 步骤 实验目标&#xff1a;利用定时器TIM2装载计数&#xff0c;1S的定时中断事件&#xff0c;事件是LED(PC13)的亮灭。 配置时钟源为外部高速源(HSE),流程…