Redis实现消息队列

使用Redis中的list实现消息队列

list是Redis的一种数据结构,可以把它理解成双向链表

可以从头部插入数据然后从尾部取出数据,从而实现消息队列的效果

利用命令 LPUSH和RPOP (从左边插入数据从右边取出数据)

lpush l1 e1 e2
rpop l1

或者 RPUSH和LPOP (从左边插入数据从右边取出数据)从而实现消息队列

rpush l1 e1 e2
lpop l1

但是使用list作为消息队列也有弊端 - 不能实现广播功能,只能单对单的进行消息队列

使用Redis中的pubsub实现消息队列

PubSub是Redis引入的一种消息传递的模型。消费者可以订阅一个或者多个Channel,从Channel中获取数据,当生产者向Channel发送数据的时候,所有的消费者都可以接收数据

(XXX是Channel xxx是消息)

发送消息

publish order.XXX xxx 

接收消息

subscribe order.XXX

但是使用PubSub作为消息队列也有弊端 - 当消息堆积以后会造成消息的丢失

使用Redis中的stream实现消息队列

stream是Redis引入的新的消息队列,是功能比较完善的消息队列

使用XADD用于添加信息

具体做法可以参考下面这张图
在这里插入图片描述

编写一段命令

XADD l1 20 * name jack age 21

使用XREAD来接收命令
在这里插入图片描述
编写一段命令来接收刚刚发送的消息

XREAD Count 1 BLOCK 20 Stream l1 0

我们也可以$来表示获取最新的消息

XREAD Count 1 BLOCK 20 Stream l1 $

当然我们也可以创建一个消息组,利用消息组来处理消息

  • 创建消息组
XGROUP CREATE l1 g1 $
  • 利用消息组读取消息
    • 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

当消息没有被确认的时候就会被放进PendingList里面等待处理

下面编写一段命令来创建两个消费者

XREADGROUP GROUP g1 c1 BLOCK 2000 STREAM l1XREADGROUP GROUP g1 c2 BLOCK 2000 STREAM l1

下面来演示一下怎么使用

public class voucherOrderHandler implements Runnable{@Orrvidepublic void run(){while(true){try{//接收信息List<MapRecord<String,Object,Object>> list 		=stringRedisTemplate.opsFotStream().read(Consumer.from("g1","c1"),StreamReadOptions.empty().count(1).block(Duration.ofSeconds(2)),StreamOffset.create("stream.orders",ReadOffset.lastConsumed()));//省略一堆业务代码//确认机制stringRedisTemplate.opsForStream.acknowledge("s1","g1",record.getId();			}catch(Exception e){log.erroe("消息处理异常",e);handlePendingList();}}}//当消息没有被确认就会出现异常,那么我们就从PendingList里面尝试取出数据public void handlePendingList(){//几乎同样的逻辑再来一遍while(true){try{//接收信息 从PendingList中读取消息不需要阻塞List<MapRecord<String,Object,Object>> list = stringRedisTemplate.opsFotStream().read(Consumer.from("g1","c1"),StreamReadOptions.empty().count(1)StreamOffset.create("stream.orders",ReadOffset.from("0")))//省略一堆业务代码(当处理完消息的时候记得退出循环)//确认机制stringRedisTemplate.opsForStream.acknowledge("s1","g1",record.getId();	//当出现异常的时候由于我们已经设置类while(true)所以会自动循环		}catch(Exception e){log.erroe("消息处理异常",e);try{Thread.sleep(20);}catch(Exception e){e.printStackTrace();}}}}
} 

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

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

相关文章

mac上使用虚拟机vm, 里面的镜像挂起会占用电脑的内存吗, 挂起和关机的区别是什么, 会影响正常电脑的内存和硬盘使用吗

解释 在Mac&#xff08;或任何其他操作系统&#xff09;上使用虚拟机&#xff08;如VMware Fusion、Parallels Desktop、VirtualBox等&#xff09;时&#xff0c;“挂起”&#xff08;Suspend&#xff09;和“关机”&#xff08;Power Off或Shut Down&#xff09;是两种不同的虚…

Dynamics 365 重写自带按钮

必备工具&#xff1a;Ribbon Workbench 步骤&#xff1a; 1、查看默认按钮使用的方法名称 右键按钮选择自定义命令(Customise Command)&#xff0c;然后查看command使用的命令 2、在前台chrome浏览器中搜索对应的命令&#xff0c;查看命令细节 3、基于命令细节新建command&am…

内裤洗衣机有用吗?最好用的四款内衣洗衣机测评

相信很多小伙伴往往会因为懒而不想洗内衣&#xff0c;又或者洗内衣时经常会洗不干净&#xff01;这时就很有必要入手一台内衣洗衣机了&#xff0c;当我们洗完澡时&#xff0c;顺手把内衣放入洗衣机内&#xff0c;一键启动即可把我们的内衣洗得干干净净&#xff01;同时还可以为…

Node.js与npm版本比对

Node.js与npm版本比对 Node.js与npm版本比对版本对比表Node版本对比 Node.js与npm版本比对 我们在项目开发过程中&#xff0c;经常会遇到公司一些老的前端工程项目&#xff0c;而我们当前的node及npm版本都是相对比较新的了。 在运行以前工程时&#xff0c;会遇到相关环境不匹…

uview 1 uni-app表单 number digit 的输入框有初始化赋值后,但是校验失败

背景&#xff1a; 在onReady初始化规则 onReady() { this.$refs.uForm.setRules(this.rules); }, 同时&#xff1a;ref,model,rules,props都要配置好。 报错 当input框限定type为number&#xff0c;digit类型有初始值不做修改动作,直接提交会报错&#xff0c;验…

PCIe架构的处理器系统介绍

不同的处理器系统中&#xff0c;PCIe体系结构的实现方式不尽相同。PCIe体系结构以Intel的x86处理器为蓝本实现&#xff0c;已被深深地烙下x86处理器的印记。在PCIe总线规范中&#xff0c;有许多内容是x86处理器独有的&#xff0c;也仅在x86处理器的Chipset中存在。在PCIe总线规…

lua-web-utils和proxy程序示例

以下是一个使用lua-web-utils和https://www.duoip.cn/get_proxy的爬虫程序示例。每行代码后面都给出了详细的中文解释。 -- 导入所需的库 local http require("http") local ltn12 require("ltn12") local json require("json") local web_u…

【MySQL】SQL语句优化

文章目录 索引属性限定索引语句高性能 SQL数值类型Explain 索引属性限定 避免索引字段使用 null B 树索引必须先进行比较当前值后再确定下一步查找范围&#xff0c;null 值只能全盘扫描。包含 null 值的列无法作为索引&#xff0c;聚合索引中只要有一列存在 null 就无法使用索…

mac安装jdk

1、下载jdk&#xff08;我的电脑要下载arm版&#xff0c;截图不对&#xff09; Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/#jdk17-mac 2、双击安装

PostgreSQL 的 Replication Slot分析研究

PostgreSQL 9.4 开始支持Replication Slot新功能。对于Replication Slot&#xff0c;文档上介绍的不多&#xff0c;乍一看让人比较难理解是做什么的。其实&#xff0c;Replication Slot的出现&#xff0c;主要是为最终在PG内核实现逻辑复制和双向复制铺路的&#xff08;目前&am…

详解 Diffusion (扩散) 模型

扩散模型是跨不同深度学习领域使用的生成模型。目前&#xff0c;它们主要用于图像和音频生成。最值得注意的是&#xff0c;这些模型是令人印象深刻的图像生成模型&#xff08;例如 Dalle2 和稳定扩散&#xff09;背后的驱动力。我相信您已经看过这些模型生成的闪烁图像。令人惊…

线性表操作的实现--单链表(链式存储结构)

本文参考朱战力老师的数据结构与算法--使用C语言一书 目录 文章目录 前言 一、链表是什么&#xff1f; 二、具体实现 1.单链表的定义 2.初始化ListInitiate&#xff08;SLNode **head&#xff09; 3.求当前元素的个数ListLength&#xff08;SLNode *head&#xff09; 4.插入Lis…

生鲜加工废水处理设备构造工艺流程

诸城市鑫淼环保小编带大家了解一下生鲜加工废水处理设备构造工艺流程 1.机械格栅设备&#xff1a;生鲜水产品加工废水首先经过车间排放到收集池&#xff0c;然后利用机械格栅设备&#xff0c;它能拦截并去除大颗粒悬浮物&#xff0c;防止后续处理过程中的水泵堵塞问题。 2.调节…

8.2 矢量图层点要素单一符号使用一

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染简单标记(Simple Marker)QGis代码实现 SVG标记&#xff08;SVG marker&#xff09;QGis代码实现 总结 前言 上一篇教程对矢量图层符号化做了一个整体介绍&#xff0c;并以点图层为例介绍了可以使用的渲染器&am…

c语言进制的转换16进制转换2进制

c语言进制的转换16进制转换2进制 c语言的进制的转换 c语言进制的转换16进制转换2进制一、16进制的介绍二、八四二一法则三、16进制转换2进制 一、16进制的介绍 十六进制&#xff1a; 十六进制逢十六进一&#xff0c;所有的数组是0到9和A到F组成&#xff0c;其中A代表10&#x…

linux vim 删除多行

使用linux服务器&#xff0c;免不了和vi编辑打交道&#xff0c;命令行下删除数量少还好&#xff0c;如果删除很多&#xff0c;光靠删除键一点点删除真的是头痛&#xff0c;还好Vi有快捷的命令可以删除多行、范围。 删除行 在Vim中删除一行的命令是dd。 以下是删除行的分步说明…

【网络原理】| 应用层协议与传输层协议 (UDP)

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;javaEE初阶 &#x1f397;️ 乾坤未定&#xff0c;你我皆黑马 目录 一、应用层协议二、传输层协议&#xff08;UDP协议&#xff09; 一、应用层协议 应用层是和代码直接相关的一层&#xff0c;决定…

Leetcode第 368 场周赛

元素和最小的山形三元组 II 预处理前缀和后缀最小值,记为pre[i]和sa[i] 对于当前编号i&#xff0c;如果前面的最小值和后面的最大值都小于nums[i],则记录ans[i] nums[i]pre[i-1]sa[i1] 结果输出最小的ans[i]即可。 合法分组的最少组数 统计每一个数字出现的次数。将每一个数…

电能计量与远程抄表的应用

摘要&#xff1a;结合当前电力企业实际的发展概况&#xff0c;可知电力活动开展中对于性能可靠的电能计量及远程抄表依赖程度高&#xff0c;需要注重它们实际应用范围的扩大&#xff0c;满足电力企业长期稳定发展的实际需求。基于此&#xff0c;本文将对电能计量与远程抄表应用…

【前端】Webpack5中Html和CSS的压缩打包

1.Webpack5简介 1.1.Webpack简介 &#xff08;1&#xff09;webpack的发展历程 2012.3—webpack&#xff08;问世&#xff09; 2014.2—webpack1 2016.12—webpack2 2017.6—webpack3 2018.2—webpack4 2020.10—webpack5&#xff08;要求node版本10.13&#xff09; &a…