Redis实现消息队列

微信公众号访问地址:Redis实现消息队列

推荐文章:

    1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表;

    2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据;

    3、为什么引入Redisson分布式锁?

    4、Redisson可重入锁原理

    5、SpringBoot整合多数据源,并支持动态新增与切换(详细教程)

一、简介

      消息队列是一种常用的通信模式,用于解耦消息的发送者和接收者,并实现异步处理。目前基于redis(版本大于5.0)实现消息队列的方案如下:

消息队列的定义及实现方式:

消息队列需要满足的要求:

1顺序一致即要保证消息发送的顺序和消费的顺序是一致的,不一致的话可能会导致业务上的错误。
2消息确认机制对于一个已经被消费的消息(已经收到ACK)不能再次被消费。
3消息持久化要具有持久化的能力,避免消息丢失,这样当消费者异常宕机导致再次重启后需要重新消费消息时可以再次获取。

二、基于LIST结构模拟消息队列

备注:一对一模式

案例如下:

消息发送端:

127.0.0.1:6379> lpush mesg 1 2(integer) 2127.0.0.1:6379> lpush mesg 3 4 5(integer) 3127.0.0.1:6379>

消息接收端:

127.0.0.1:6379> brpop mesg 201) "mesg"2) "1"(11.11s)127.0.0.1:6379> brpop mesg 201) "mesg"2) "2"127.0.0.1:6379> brpop mesg 201) "mesg"2) "3"(12.37s)127.0.0.1:6379>  brpop mesg 201) "mesg"2) "4"127.0.0.1:6379>  brpop mesg 201) "mesg"2) "5"127.0.0.1:6379>  brpop mesg 20(nil)(20.09s)127.0.0.1:6379>

总结如下:

三、基于PubSub的消息队列

备注:一对多模式(广播模式)

案例如下:

发布端:

127.0.0.1:6379> publish order.msg01 msg001(integer) 2127.0.0.1:6379> publish order.msg01 msg002(integer) 2127.0.0.1:6379> publish order.msg01 msg003(integer) 2127.0.0.1:6379> publish order.msg02 msg004

订阅端:

1、指定channel的订阅

127.0.0.1:6379> SUBSCRIBE order.msg01Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "order.msg01"3) (integer) 11) "message"2) "order.msg01"3) "msg001"1) "message"2) "order.msg01"3) "msg002"1) "message"2) "order.msg01"3) "msg003"

2、模糊channel的订阅

127.0.0.1:6379> PSUBSCRIBE order.*Reading messages... (press Ctrl-C to quit)1) "psubscribe"2) "order.*"3) (integer) 11) "pmessage"2) "order.*"3) "order.msg01"4) "msg001"1) "pmessage"2) "order.*"3) "order.msg01"4) "msg002"1) "pmessage"2) "order.*"3) "order.msg01"4) "msg003"1) "pmessage"2) "order.*"3) "order.msg02"4) "msg004"

运行情况如下:

总结如下:

四、基于Stream的消息队列

详细内容参考:https://www.knowledgedict.com/tutorial/redis-streams.html

4.1、发送消息的命令:xadd

案例如下:

10.1.50.157:0>XADD  student * name xiaoli sex 男 age 21"1691919968658-0"10.1.50.157:0>XLEN  student"1"10.1.50.157:0>

效果如下:

4.2、读取消息的方式之一:xread

案例如下:

发送端:

10.1.50.157:0>XADD  student * name xiaoli sex 男 age 21"1691919968658-0"10.1.50.157:0>XLEN  student"1"10.1.50.157:0>XADD student * name xiaoli02 sex 女 age 20"1691920556051-0"10.1.50.157:0>XADD student * name xiaoli02 sex 女 age 28"1691920957334-0"10.1.50.157:0>XADD student * name xiaoli02 sex 女 age 29"1691920975931-0"10.1.50.157:0>

消费端:

10.1.50.157:0>XREAD COUNT 1 BLOCK 0 STREAMS student $1) 1) "student"   2) 1) 1) "1691920851885-0"         2) 1) "name"            2) "xiaoli02"            3) "sex"            4) "女"            5) "age"            6) "21"

数据展示:

总结如下:

4.3、读取消息的方式之二:消费者组

常见使用命令如下:

4.3.1、创建消费者组命令:

参考案例:

10.1.50.157:0>XGROUP CREATE student gs01 0"OK"

4.3.2、从消费者组读取消息命令:

参考案例:

 -- 消费者c0110.1.50.157:0>XREADGROUP GROUP gs01 c01 COUNT 1 BLOCK 2000 STREAMS student >1) 1) "student"   2) 1) 1) "1691920851885-0"         2) 1) "name"            2) "xiaoli02"            3) "sex"            4) "女"            5) "age"            6) "21"
10.1.50.157:0>XREADGROUP GROUP gs01 c01 COUNT 1 BLOCK 2000 STREAMS student >1) 1) "student"   2) 1) 1) "1691920917913-0"         2) 1) "name"            2) "xiaoli02"            3) "sex"            4) "女"            5) "age"            6) "25" -- 消费者c02 10.1.50.157:0>XREADGROUP GROUP gs01 c02 COUNT 1 BLOCK 2000 STREAMS student >1) 1) "student"   2) 1) 1) "1691920870086-0"         2) 1) "name"            2) "xiaoli02"            3) "sex"            4) "女"            5) "age"            6) "23"                  

XACK命令:

参考案例:

10.1.50.157:0>XACK student gs01 1691920917913-0"1"

XPENDING命令:

参考案例:

10.1.50.157:0>XPENDING student gs01 - + 101) 1) "1691919968658-0"   2) "c01"   3) "2523762"   4) "1"
2) 1) "1691920556051-0"   2) "c01"   3) "2500637"   4) "1"

4.4、在java中的应用

4.5、总结


五、全文总结

       对于中小型企业,对于消息机制要求不算太严格,推荐使用Stream,基本上满足要求了。但是对于大型企业,对消息要求比较严格,还是推荐使用更更专业的消息中间件,像:RabbitMQ、Kafka等等,因为Stream只满足消费者的ACK确认机制,生产者并不满足。

更多优秀文章,请关注个人微信公众号或搜索“程序猿小杨”查阅。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java多线程编程中的线程同步

Java多线程编程中的线程同步 基本概念: ​ 线程同步是多线程编程中的一个重要概念,用于控制多个线程对共享资源的访问,以防止数据的不一致性和并发问题。 在多线程环境下,多个线程同时访问共享资源可能导致数据的竞争和不正确的…

级联(数据字典)

二级级联: 一:新建两个Bean 父级: /*** Description 数据字典* Author WangKun* Date 2023/7/25 10:15* Version*/ Data AllArgsConstructor NoArgsConstructor TableName("HW_DICT_KEY") public class DictKey implements Seri…

elementUI 的上传组件<el-upload>,自定义上传按钮样式

方法一&#xff1a; 原理&#xff1a;调用<el-upload>组件的方法唤起选择文件事件 效果&#xff1a; 页面代码&#xff1a; 1、选择图片按钮 <div class"flex_row_spacebetween btn" click"chooseImg"><span class"el-icon-plus ic…

企业数字化转型:无形资产占比测算(2007-2021年)

在本次数据中&#xff0c;参考张永珅老师的做法&#xff0c;利用无形资产占比测算数字化转型程度。 一、数据介绍 数据名称&#xff1a;企业数字化转型&#xff1a;无形资产占比 数据年份&#xff1a;2007-2021年 样本数量&#xff1a;32960条 数据说明&#xff1a;包括数…

邀请函|澎峰科技邀您参加CCF HPC China2023

一年一度的全球超算盛会&#xff01; 以“算力互联智领未来”为主题的第十九届全国高性能计算学术年会&#xff08;CCF HPC China 2023&#xff09;将于8月24-26日&#xff08;展览23-25日&#xff09;在青岛红岛国际会议展览中心举办。 九大院士领衔 打造顶级超算盛会 力邀…

分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测 目录 分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测分类效果基本介绍模型描述程序设计参考资料 分类效果 基本介绍 1.MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测&#xff0c;CNN-BiLSTM结…

mysql滑动窗口案例

获取学科最高分 SELECT DISTINCT name,subject,MAX(score) OVER (PARTITION by subject) as 此学科最高分数 from scores;获取学科的报名人数 select DISTINCT subject,count(name) over (partition by subject) as 报名此学科的人数 from scores; 求学科总分 SELECT DISTI…

table 根据窗口缩放,自适应

element-plus中&#xff0c;直接应用在页面样式上&#xff0c; ::v-deep .el-table{width: 100%; } ::v-deep .el-table__header-wrapper table,::v-deep .el-table__body-wrapper table{width: 100% !important; } ::v-deep .el-table__body,::v-deep .el-table__footer,::v-d…

面试热题(缺失的第一个正数)

给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 尝试的路途是痛苦的&#xff0c;不断的尝试新方法&#xff0c;错何尝…

深度学习实战47-利用深度学习技术来解决复杂的人群计数问题,CrowdCountNet模型的应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战47-利用深度学习技术来解决复杂的人群计数问题,CrowdCountNet模型的应用。本篇文章,我将向大家展示如何使用CrowdCountNet这个神奇的工具,以及它是如何利用深度学习技术来解决复杂的人群计数问题。让我们一起进入这个充满…

分布式监控平台——Zabbix

市场上常用的监控软件&#xff1a; 传统运维&#xff1a;zabbix、 Nagios 一、zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监…

idea格式化日志打印

Live Template 需要在Live Templates里面创建一个模板组为MyTemplate 触发时机选择java 1、创建一个loge log.error($content$,$params$); content groovyScript("def params _3.collect {【it {}】}.join(, ); return \" _1 . _2 () exception > (params…

7-15 然后是几点

有时候人们用四位数字表示一个时间&#xff0c;比如 1106 表示 11 点零 6 分。现在&#xff0c;你的程序要根据起始时间和流逝的时间计算出终止时间。 读入两个数字&#xff0c;第一个数字以这样的四位数字表示当前时间&#xff0c;第二个数字表示分钟数&#xff0c;计算当前时…

成集云 | 用友U8采购请购单同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 用友U8是中国用友集团开发和推出的一款企业级管理软件产品。具有丰富的功能模块&#xff0c;包括财务管理、采购管理、销售管理、库存管理、生产管理、人力资源管理、客户关系管理等&#xff0c;可根据企业的需求选择相应的模块进行集…

C++之std::call_once实例(一百七十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【Vue-Router】重定向

First.vue <template><h1>First Seciton</h1> </template>Second.vue&#xff0c;Third.vue代码同理 UserSettings.vue <template><h1>UserSettings</h1><router-link to"/settings/children1">children1</ro…

Java Vue Uniapp MES生产执行管理系统

本MES系统是一款B/S结构、通用的生产执行管理系统&#xff0c;功能强大&#xff01; 系统基于多年离散智造行业的业务经验组建&#xff0c;主要目的是为国内离散制造业的中小企业提供一个专业化、通用性、低成本的MES系统解决方案。 联系作者获取

Webpack 的 sass-loader 在生产模式下最小化 CSS 问题

学习webpack时候我发现一个问题&#xff1a; 将mode 改为production模式后&#xff0c;生成的css会被压缩了&#xff0c;但是我并没有引入CssMinimizerPlugin插件&#xff0c;然后我试着将optimization.minimize 设置为false&#xff0c;测试是否为webpack自带的压缩&#xff0…

vscode的配置和使用

1.侧边栏调整大小 放大&#xff1a;View -> Appearance -> Zoom in&#xff08;快捷键Ctrl &#xff09; 缩小&#xff1a;View -> Appearance -> Zoom out&#xff08;快捷键Ctrl -&#xff09; 侧边栏字体调整到合适大小后&#xff0c;可以按下一步调整代码区…

MFC创建和使用OCX控件

文章目录 MFC建立OCX控件注册OCX控件与反注册使用Internet Explorer测试ocx控件OCX控件添加方法OCX控件添加事件Web使用OCX控件MFC使用OCX控件使用OCX控件调用ocx的功能函数对ocx的事件响应OCX控件调试工具tstcon32.exe加载ocx控件使用tstcon32.exe调试ocxMFC建立OCX控件 新建…