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

Redis——实现消息队列

目录

前言

 基于List结构模拟消息队列

基于List实现消息队列优缺点

基于PubSub(订阅者)实现消息队列

示例

 基于PubSub的消息队列的优缺点

基于Stream的消息队列

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

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

基于消费者监听消息的基本思路: 

 stream类型消息队列的xreadgroup命令特点:

Redis消息队列总结


前言

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

以下就是基于Redis结构特性来实现消息队列

 基于List结构模拟消息队列

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

对于Redis的list数据结构操作方法LPUSH,RPOP,RPUSH,LPOP这些方法。可以利用这些方法来实现消息队列。

如果不知道这些方法怎么使用找到redis的客户端 使用和help + 对应操作方法就可以展现出相关文档使用

基于List实现消息队列优缺点

优点:

  1.  利用Redis存储,不受限于JVM内存上限
  2. 基于Redis的持久化机制,数据安全性有保证
  3. 可以满足消息的有序性

缺点:

  1. 无法避免消息丢失(从消息队列中取出一条消息还没来得及处理就出现异常,这条消息就会丢失,remove出一条消息,list中就没有了
  2. 只支持单消费者(发送一条消息remove移除了,其他消费者就拿不到了)

基于PubSub(订阅者)实现消息队列

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

PubSub设计之初本来就是用来作消息频道的,有人订阅就会接收,没人接收就不会保存到PubSub直接丢失

示例

 基于PubSub的消息队列的优缺点

优点:

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

缺点:

  1. 不支持数据持久化(pusub本来就是用作消息队列的不像list本来就是数据结构数据存储,发布消息没人订阅的化消息丢失
  2. 无法避免消息丢失
  3. 消息堆积有上限,超出时数据丢失(发送消息有人订阅,会在消费者那里缓存,缓存空间有上限,连续发很多消息就会消息丢失)

基于Stream的消息队列

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

    发送消息的命令:(也就是往消息队列添加一条消息)

    例如:

     读取消息的方式之一:xread

     示例:

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

    whlie(true){//尝试读取队列中的消息,最多阻塞2s
    Object msg = redis.execute("xread count 1 block 2000 streams users $");
    if(msg == null){continue;
    }
    //处理消息handleMessga(mag);

    注意

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

    1.消息可回溯(消息读取完之后不消失)

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

    3.可以阻塞读取

    4.有漏读风险

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

    消费者组(consumer Group):将多个消费者划分到一个组中,监听同一个队列。具备一下特点:消息分流,消息标识,消息确认

    创建消费者组: 

    其他常见命令:

    一般情况下不需要自己去添加消费者,当我们从这个组中指定一个消费者并且监听消息的时候,如果发现消费者不存在自动帮我们创建出来,并不需要手动去创建

    从消费者组读取消息:

    基于消费者监听消息的基本思路: 

      while (true){//尝试监听队列,使用阻塞模式,最长等待2秒Object msg = redis.call("xreadgroup group g1 c1 count 1 block 2 streams s1 >");if(msg == null){continue;}try {//处理消息,完成后一定要ackhandleMassage(msg);}catch (Exception e){while (true){Object msg = redis.call("xreadgroup group g1 c1 count 1 block 2 streams s1 0");if(msg == null){continue;}try {//说名没有异常消息,再次处理handleMassge(msg);}catch (Exception e){//再次出现异常,记录日志,继续循环continue;}}}

     stream类型消息队列的xreadgroup命令特点:

    • 消息可回溯
    • 可以多消费争抢消息,加快消费速度
    • 可以阻塞读取.
    • 没有消息漏读风险
    • 有消息确认机制,保证消息至少被消费一次

    Redis消息队列总结

      相关文章:

      Redis——实现消息队列

      目录 前言 基于List结构模拟消息队列 基于List实现消息队列优缺点 基于PubSub(订阅者)实现消息队列 示例 基于PubSub的消息队列的优缺点 基于Stream的消息队列 STREAM类型消息队列的XREAD命令特点: 基于Stream的消息队列-消费者组 基于…...

      学习51单片机Day01---做实验前置一些内容

      目录 一、前面要看的: 1.下载软件 2.如何开始做? 3.基本框架: 4.如何编译运行: 5.可以运行的样子: 6.怎么生成hex: 7.滴滴放到单片机上: 二、过程中可能出现的问题(一直会更…...

      pipe匿名管道实操(Linux)

      管道相关函数 1 pipe 是 Unix/Linux 系统中的一个系统调用&#xff0c;用于创建一个匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 参数说明&#xff1a; pipefd[2]&#xff1a;一个包含两个整数的数组&#xff0c;用于存储管道的文件描述符&#xff1a; pi…...

      vscode 异常关闭后无法远程连接服务器

      笔记本没关机只是合上&#xff0c;结果第二天上班整台笔记本高度发热发烧&#xff0c;吓坏了。。。 强制关机后再开机&#xff0c;幸好能用。但是vscode连接服务器一直不对。 解决方式&#xff1a; 解决一&#xff1a;打开VS Code菜单"View"->“Command Palatt…...

      Rust主流框架性能比拼: Actix vs Axum vs Rocket

      本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中&#xff0c;我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…...

      二氧化铪(HfO2)市场发展分析:从基础到前沿应用

      引言&#xff1a;探索二氧化铪的重要性与市场潜力 在现代材料科学中&#xff0c;二氧化铪&#xff08;HfO2&#xff09;作为一种关键的高介电常数&#xff08;High-k&#xff09;材料&#xff0c;正逐渐成为半导体行业不可或缺的一部分。二氧化铪是一种白色的固体&#xff0c;…...

      写一个简单的demo来理解数据库外键

      准备工作 安装MySQL 确保已安装MySQL&#xff0c;并启动服务。可以通过命令行或工具&#xff08;如MySQL Workbench&#xff09;操作。 创建数据库 sql 复制 CREATE DATABASE school; USE school;创建父表和子表 步骤 1&#xff1a;创建父表&#xff08;students&#xff09;…...

      Prompt-to-prompt image editing with cross attention control

      Project Page: https://prompt-to-prompt.github.io Paper: https://arxiv.org/abs/2208.01626 Code: https://github.com/google/prompt-to-prompt 文章目录 1. Introduction2. Method2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-att…...

      C++Cherno 学习笔记day18 [71]-[75] C++安全、PCH、dynamic_cast、基准测试、结构化绑定

      b站Cherno的课[71]-[75] 一、现代C中的安全以及如何教授二、C的预编译头文件PCH三、C的dynamic_cast四、C的基准测试五、C的结构化绑定 一、现代C中的安全以及如何教授 安全编程&#xff0c;或者说C编程中&#xff0c;降低崩溃&#xff0c;内存泄露、非法访问等问题 C11&#…...

      根据 PID 找到对应的 Docker 容器

      引言 在日常运维与调试过程中&#xff0c;我们常常需要查找某个进程所属的 Docker 容器。当系统出现问题或资源异常时&#xff0c;根据进程的 PID 找到其所属容器可以帮助我们迅速定位问题。本文将介绍如何利用 Linux 的 cgroup 机制&#xff0c;以及 Docker 提供的工具来完成…...

      传统项目纯前端实现导出excel之xlsx.bundle.js

      传统项目纯前端实现导出excel之xlsx.js 自从vue问世后&#xff0c;使得前端开发更加简洁从容&#xff0c;极大的丰富组件样式和页面渲染效果&#xff0c;使得前端功能的可扩展性得到极大地加强。虽然vue的使用对于前后端分离的项目对于功能实现与扩展有了质的飞跃&#xff0c;但…...

      大型手游 DDoS 攻击怎么防护?游戏盾 SDK 技术解剖实录

      一、重灾区警报&#xff1a;大型手游为何成为 DDoS 靶心&#xff1f; 1. 血淋淋的行业数据 攻击规模暴涨&#xff1a;2024 年全球手游遭受 > 300Gbps 攻击次数同比激增 173%&#xff08;Akamai 报告&#xff09;经济杀伤链&#xff1a;1 小时 500Gbps 攻击可造成&#xff…...

      【Harmony】状态管理(V1)

      一、概述 文章目录 一、概述二、组件状态管理1、State1.1、State简介1.2、State简单示例 2、Prop2.1、Prop简介2.2、Prop底层实现原理2.3、Prop简单示例 3、Link3.1、Link简介3.2、Link底层实现原理3.3、Link简单示例 4、Provide Consume4.1、Provide Consume简介4.2、Provide …...

      udev规则实例:监听usb插拔事件并做出相应

      在 Linux 和 Android 系统中&#xff0c;USB 插拔事件的判断涉及从内核到用户空间的多层协作。以下是源码中关键判断点的梳理&#xff1a; 事件流程 内核层&#xff1a;UEvent 机制 USB 插拔事件首先由内核通过 UEvent 机制 上报。内核中的 USB 驱动&#xff08;如 drivers/…...

      【算法】【蓝桥23国A软件C】四版代码思路分析与逐步优化

      题目来源&#xff1a;第十四届蓝桥杯大赛软件赛国赛C/C 大学 A 组 题目描述&#xff1a; 问题描述 给定一个 WH 的长方形&#xff0c;两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗&#xff0c;正方形的边长至少为 2&#xff0c;不允…...

      程序设计竞赛1

      题目1 2025年春节期间&#xff0c;DeepSeek作为“AI界的天降紫微星”成为新晋效率神器&#xff0c;热度席卷全球&#xff0c;其团队主创成员也迅速引起了大家的关注。 DeepSeek之所以能在短时间内取得如此不凡成绩&#xff0c;与其团队成员的背景密不可分。团队汇聚了来自清华…...

      android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

      我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。 apksigner verify -v app-debug.apk ​​​​​​​Verifies Verified using v1 scheme (JAR signing): false Verified usin…...

      EPGAN:融合高效注意力的生成对抗网络图像修复算法

      简介 简介:利用掩码设计来遮掉输入图像的一部分,将这类图像输入给生成器。生成器结合ECA注意力机制架构,利用感知损失、对抗损失和均方误差损失的加权和来作为生成器的损失计算。鉴别器分别对应掩码和整张图做损失计算。 论文题目:融合高效注意力的生成对抗网络图像修复算…...

      使用模板报错:_G.unicode.len(orgline.text_stripped:gsub(“ “,““))

      使用aegisub制作歌词特效&#xff0c;白嫖大佬的自动化模板时&#xff0c;经常会遇到如下报错&#xff1a; Runtime error in template code: Expected 1 arguments, got 2 Code producing error: ci {0,0}; cn _G.unicode.len(orgline.text_stripped:gsub(" ",&q…...

      linux入门六:Linux Shell 编程

      一、Shell 概述 1. 什么是 Shell&#xff1f; Shell 是 Linux 系统中用户与内核之间的桥梁&#xff0c;作为 命令解析器&#xff0c;它负责将用户输入的文本命令转换为计算机可执行的机器指令。 本质&#xff1a;Shell 是一个程序&#xff08;如常见的 Bash、Zsh&#xff09…...

      Franka 机器人x Dexterity Gen引领遥操作精细任务新时代

      教授机器人工具灵活操作难题 在教授机器人灵活使用工具方面&#xff0c;目前主要有两种策略&#xff1a;一是人类遥控&#xff08;用于模仿学习&#xff09;&#xff0c;二是模拟到现实的强化学习。然而&#xff0c;这两种方法均存在明显的局限性。 1、人类遥控&#xff08;用…...

      网络通讯协议UDP转发TCP工具_UdpToTcpRelay_双向版

      UDP/TCP网络转发器程序说明书 1. 程序概述 本程序是一个高性能网络数据转发工具&#xff0c;支持UDP和TCP协议之间的双向数据转发&#xff0c;并具备以下核心功能&#xff1a; 协议转换&#xff1a;实现UDP↔TCP协议转换数据转换&#xff1a;支持十六进制/ASCII格式的数据转…...

      深入理解 RxSwift 中的 Driver:用法与实践

      目录 前言 一、什么是Driver 1.不会发出错误 2.主线程保证 3.可重放 4.易于绑定 二、Driver vs Observable 三、使用场景 1.绑定数据到UI控件 2.响应用户交互 3.需要线程安全的逻辑 4.如何使用Driver&#xff1f; 1.绑定文本输入到Label 2.处理按钮点击事件 3…...

      【XML基础-3】深入理解XML Schema:XML的强大语义约束机制

      XML&#xff08;可扩展标记语言&#xff09;作为数据交换的标准格式&#xff0c;在当今信息技术领域扮演着重要角色。然而&#xff0c;仅有基本的XML语法规则往往不足以满足复杂的数据验证需求。这正是XML Schema发挥作用的地方——它为XML文档提供了强大的语义约束能力。本文将…...

      神经网络语言模型与统计语言模型的比较

      神经网络语言模型&#xff08;Neural Language Models, NLMs&#xff09;与统计语言模型&#xff08;Statistical Language Models, SLMs&#xff09;是自然语言处理&#xff08;NLP&#xff09;中两类核心的语言建模方法&#xff0c;其核心差异体现在建模方式、表示能力、数据…...

      大模型论文:CRAMMING TRAINING A LANGUAGE MODEL ON ASINGLE GPU IN ONE DAY(效率提升)-final

      大模型论文&#xff1a;CRAMMING: TRAINING A LANGUAGE MODEL ON ASINGLE GPU IN ONE DAY(效率提升) 文章地址&#xff1a;https://arxiv.org/abs/2212.14034 摘要 近年来&#xff0c;语言建模的研究趋势集中在通过大规模扩展来提升性能&#xff0c;导致训练语言模型的成本变…...

      构建AI应用(持续更新)

      常用的框架&#xff1a; dify、coze&#xff1a;低代码模块化编程 langchain&#xff1a;面向程序人员 常规的应用&#xff1a; 语音转文字ASR&#xff0c;文字转语音TTS&#xff0c;下一步问题建议&#xff0c; 旅游计划&#xff0c;买点提取&#xff0c;情感陪聊&#x…...

      【JAVA】JVM 堆内存“缓冲空间”的压缩机制及调整方法

      1. 缓冲空间是否可压缩&#xff1f; 是的&#xff0c;JVM 会在满足条件时自动收缩堆内存&#xff0c;将未使用的缓冲空间释放回操作系统。但需满足以下条件&#xff1a; GC 触发堆收缩&#xff1a;某些垃圾回收器&#xff08;如 G1、Serial、Parallel&#xff09;在 Full GC …...

      NLP高频面试题(三十八)——什么是LLM的灾难性遗忘?如何避免灾难性遗忘?

      近年来,大语言模型在人工智能领域取得了显著进展。然而,随着模型的不断更新和新任务的引入,出现了一个重要的问题,即灾难性遗忘(Catastrophic Forgetting)。灾难性遗忘指的是大模型在连续学习新知识或新任务时,先前掌握的旧知识会迅速被覆盖或遗忘,从而导致模型在旧任务…...

      Keepalived+LVS高可用集群实战:从原理到落地

      在分布式系统架构中&#xff0c;服务的高可用性和负载均衡是保障业务连续性的核心要素。本文通过一次实验&#xff0c;深入探索了基于KeepalivedLVS的高可用负载均衡集群方案&#xff0c;带您从零开始理解原理、动手实践配置&#xff0c;并验证其可靠性。 一、实验目标 本次实…...

      【JVM】JVM调优实战

      &#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…...

      Linux系统安全-开发中注意哪些操作系统安全

      Hey小伙伴们~&#x1f44b; 在Linux开发中&#xff0c;确保操作系统的安全真的太太太重要啦&#xff01;&#x1f6e1;️ 今天就来和大家聊聊几个超关键的注意事项&#xff0c;记得拿小本本记下来哦&#xff01;&#x1f4dd; 1️⃣ ‌用户管理与权限控制‌&#x1f465; 合理…...

      Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼

      1. 问题 使用Qt进行研发时&#xff0c;遇到一个问题&#xff0c;当在系统默认输入法中文&#xff08;英文输入法或者搜狗就不会触发闪退&#xff09;的情况下&#xff0c;选中QTableWidget控件&#xff08;QTableWidgetItem有焦点&#xff0c;但是不双击&#xff09;&#xff…...

      2025 年“认证杯”数学中国数学建模网络挑战赛 D题 无人机送货规划

      在快递和外卖等短途递送小件货物的业务中&#xff0c;无人机或许大有可为。现 有一个城市的快递仓库准备使用若干无人机进行派件&#xff0c;设有若干架无人机从 仓库出发&#xff0c;分别装载了若干快递包裹。每架无人机装载的包裹的收货地点会 被排列为一个目的地列表&#x…...

      【2025年认证杯数学中国数学建模网络挑战赛】A题解题思路与模型代码

      【2025年认证杯数学建模挑战赛】A题 该题为典型的空间几何建模轨道动力学建模预测问题。 ⚙ 问题一&#xff1a;利用多个天文台的同步观测&#xff0c;确定小行星与地球的相对距离 问题分析 已知若干地面天文台的观测数据&#xff1a;方位角 (Azimuth) 和 高度角 (Altitude)&…...

      Redhat红帽 RHCE8.0认证体系课程

      课程大小&#xff1a;7.7G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90546064 更多资源下载&#xff1a;关注我 红帽企业 Linux 系统的管理技能已经成为现代数据中心的核心竞争力。 Linux 在支持混合云、跨物理服务器、虚机、私有云和公共云计…...

      Python 实现的运筹优化系统数学建模详解(最大最小化模型)

      一、引言 在数学建模的实际应用里&#xff0c;最大最小化模型是一种极为关键的优化模型。它的核心目标是找出一组决策变量&#xff0c;让多个目标函数值里的最大值尽可能小。该模型在诸多领域&#xff0c;如资源分配、选址规划等&#xff0c;都有广泛的应用。本文将深入剖析最大…...

      MySQL快速入门

      MySQL快速入门 SQL语句 SQL语句概述 1.SQL 是用于访问和处理数据库的标准的计算机语言。 2.SQL指结构化查询语言&#xff0c;全称是 Structured Query Language。 3.SQL 可以访问和处理数据库。 4.SQL 是一种 ANSI&#xff08;American National Standards Institute 美国…...

      离线安装 nvidia-docker2(nvidia-container-toolkit)

      很多时候大家都有用docker使用gpu的需求&#xff0c;但是因为网络等原因不是那么好用&#xff0c;这里留了一个给ubuntu的安装包&#xff0c;网络好的话也提供了在线安装方式 安装 nvidia-docker2 1 离线安装 &#xff08;推荐&#xff09; unzip解压后进入目录 dpkg -i *.d…...

      【自然语言处理】深度学习中文本分类实现

      文本分类是NLP中最基础也是应用最广泛的任务之一&#xff0c;从无用的邮件过滤到情感分析&#xff0c;从新闻分类到智能客服&#xff0c;都离不开高效准确的文本分类技术。本文将带您全面了解文本分类的技术演进&#xff0c;从传统机器学习到深度学习&#xff0c;手把手实现一套…...

      云原生运维在 2025 年的发展蓝图

      随着云计算技术的不断发展和普及&#xff0c;云原生已经成为了现代应用开发和运维的主流趋势。云原生运维是指在云原生环境下&#xff0c;对应用进行部署、监控、管理和优化的过程。在 2025 年&#xff0c;云原生运维将迎来更加广阔的发展前景&#xff0c;同时也将面临着一系列…...

      Windows系统Python多版本运行解决TensorFlow安装问题(附详细图文)

      Windows系统Python多版本运行解决TensorFlow安装问题&#xff08;附详细图文&#xff09; 摘要 TensorFlow 无法安装&#xff1f;Python版本太高是元凶&#xff01; 本文针对Windows系统中因Python版本过高导致TensorFlow安装失败的问题&#xff0c;提供三种降级解决方案&…...

      银行业务知识序言

      银行业务知识体系全景解析 第一章 金融创新浪潮下的银行业务知识革命 1.1 数字化转型驱动金融业态重构 在区块链、人工智能、物联网等技术的叠加作用下&#xff0c;全球银行业正经历着"服务无形化、流程智能化、风控穿透化"的深刻变革。根据麦肯锡《2023全球银行业…...

      《深度剖析分布式软总线:软时钟与时间同步机制探秘》

      在分布式系统不断发展的进程中&#xff0c;设备间的协同合作变得愈发紧密和复杂。为了确保各个设备在协同工作时能够有条不紊地进行&#xff0c;就像一场精准的交响乐演出&#xff0c;每个乐器都要在正确的时间奏响音符&#xff0c;分布式软总线中的软时钟与时间同步机制应运而…...

      RK3588 android12 适配 ilitek i2c接口TP

      一&#xff0c;Ilitek 触摸屏简介 Ilitek 提供多种型号的触控屏控制器&#xff0c;如 ILI6480、ILI9341 等&#xff0c;采用 I2C 接口。 这些控制器能够支持多点触控&#xff0c;并具有优秀的灵敏度和响应速度。 Ilitek 的触摸屏控制器监测屏幕上的触摸事件。 当触摸发生时&a…...

      pgsql:关联查询union(并集)、except(差集)、intersect(交集)

      pgsql:关联查询union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客...

      模型材质共享导致的问题

      问题&#xff1a;当我选中其中某个网格模型并设置color的时候&#xff0c;相同种类的颜色都被改变&#xff0c;但是打印我选中的网格模型数据其实只有一个。 导致问题的原因&#xff1a; 加载Blender模型修改材质颜色 Blender创建一个模型对象&#xff0c;设置颜色&#xff0…...

      ThinkpPHP生成二维码

      导入依赖 composer require endroid/qr-code 封装成函数&#xff0c;传入二维码包含的值&#xff0c;存储路径&#xff0c;二维码大小&#xff0c;二维码边距 private function getCode($content, $directory, $size 300, $margin 10){// 创建二维码对象// $content: 二…...

      FLINK框架:流式处理框架Flink简介

      在大数据时代&#xff0c;数据的价值不言而喻&#xff0c;谁能利用好数据&#xff0c;谁就掌握了整个行业的先机。面对海量的数据&#xff0c;如何处理数据成为了一个难题。除了海量数据外&#xff0c;实时性也是一个重要的课题&#xff0c;所以流式数据处理便登上了技术舞台&a…...

      使用Python从零开始构建生成型TransformerLM并训练

      在人工智能的浩瀚宇宙中&#xff0c;有一种神奇的生物&#xff0c;它拥有着强大的语言魔法&#xff0c;能够生成各种各样的文本&#xff0c;仿佛拥有无尽的创造力。它就是——Transformer 模型&#xff01;Transformer 模型的出现&#xff0c;为人工智能领域带来了一场“语言魔…...