基于redis实现消息队列(更推荐使用专业的mq)

目录

 利用redis实现消息队列(基于list,点对点模型)——lpush存放队列(lpush 队列名 队列内容(可一次存放多个内容,用空格隔开)) brpop取队列(brpop 队列名 等待时间单位秒(一次取一个))

 基于pubsub实现消息队列(发布订阅模型)

 基于stream的消息队列

方法一:

存放消息

 读取消息

​编辑  案例

 特点:

 方法二:消费者组

 创建

 读取

 java实现思路

 特点

三种方式的对比:

 案例,更改之前的案例


基于基于秒杀-----分布式锁----lua脚本_xzm_的博客-CSDN博客改进

 利用redis实现消息队列(基于list,点对点模型)——lpush存放队列(lpush 队列名 队列内容(可一次存放多个内容,用空格隔开)) brpop取队列(brpop 队列名 等待时间单位秒(一次取一个))

优缺点:

 基于pubsub实现消息队列(发布订阅模型)

 

 优缺点:

 基于stream的消息队列

方法一:

存放消息

 读取消息

  案例

 特点:

 方法二:消费者组

 创建

 读取

 java实现思路

 特点

三种方式的对比:

 个人感觉:mq>stream>list>pubsub

 案例,更改之前的案例

创建消息队列

 修改Lua秒杀脚本

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by Lenovo.
--- DateTime: 2023/5/30 16:55
----- 1.参数列表
-- 1.1 . 优惠卷id
local voucherId= ARGV[1]
-- 1.2. 用户id
local userId = ARGV[2]
-- 1.3 订单id
local orderId = ARGV[3]-- 2.数据key
--2.1 库存key
local stockKey = 'seckill:stock:' .. voucherId
--2.2 订单key
local orderKey = 'seckill:order:' .. voucherId-- 3. 脚本业务
-- 3.1. 判断库存是否充足 get stockKey
if (tonumber(redis.call('get',stockKey)) <= 0 ) then-- 3.2. 库存不足,返回1return 1
end-- 3.2. 判断用户是否下单 SISMEMBER orderKey userId
if (redis.call('SISMEMBER',orderKey,userId) == 1) then-- 3.3. 存在,说明是重复下单,返回2return 2
end
-- 3.4. 扣库存 incrby stockKey -1
redis.call('incrby',stockKey, -1)
-- 3.5. 下单(保存用户) sadd orderKey userId
redis.call('sadd',orderKey,userId)
-- 3.6 发送消息到队列中,xadd stream.orders * k1 v1 k2 v2 ...
redis.call('xadd','stream.orders','*','userId',userId,'voucherId',voucherId,'id',orderId)
return 0

修改java代码实现发送消息

/*** 基于stream的实现秒杀* @param voucherId* @return*/public Result seckillVoucher(Long voucherId) {//获取用户Long userId = UserHolder.getUser().getId();//生成订单idlong orderId = redisIdWorker.nextId("order");//执行lua脚本Long result = stringRedisTemplate.execute(SECKILL_SCRIPT,//脚本文件Collections.emptyList(),//key的集合voucherId.toString(), userId.toString()  ,String.valueOf(orderId)//三个ARGV);//将返回值转换为intint i = result.intValue();//判断结果是否为零if (i != 0 ){//不为零,无法购买 ---1为库存不足,2为用户已经下单return Result.fail(i == 1 ? "库存不足" : "不能重复下单");}//可以购买//获取代理对象proxy = (IVoucherOrderService) AopContext.currentProxy();//返回订单idreturn Result.ok(orderId);}

 实现消息的消费

 //创建线程池private static final ExecutorService SECKILL_ORDER_EXECUTOR = Executors.newSingleThreadExecutor();@PostConstructprivate void init(){SECKILL_ORDER_EXECUTOR.submit(new VoucherOrderHandler());}private class VoucherOrderHandler implements Runnable{String queueName="stream.orders";@Overridepublic void run() {while (true){try {//1.获取消息队列中的订单消息,xreadgroup group g1 c1 count 1 block 2000 streams streams.order >List<MapRecord<String, Object, Object>> list = stringRedisTemplate.opsForStream().read(Consumer.from("g1", "c1"),StreamReadOptions.empty().count(1).block(Duration.ofSeconds(2)),StreamOffset.create(queueName, ReadOffset.lastConsumed()));//2.判断消息是否获取成功if (list ==null || list.isEmpty()){//获取失败,进行下一次循环continue;}//3.解析消息中的订单信息MapRecord<String, Object, Object> entries = list.get(0);Map<Object, Object> value = entries.getValue();VoucherOrder voucherOrder = BeanUtil.fillBeanWithMap(value, new VoucherOrder(), true);//2.创建订单handleVoucherOrder(voucherOrder);//ack确认 ack stream.orders g1 idstringRedisTemplate.opsForStream().acknowledge(queueName,"g1",entries.getId());} catch (Exception e) {log.error("处理订单异常",e);handlePendingList();}}}private void handlePendingList(){while (true){try {//1.获取pending-list中的订单消息,xreadgroup group g1 c1 count 1  streams streams.order >List<MapRecord<String, Object, Object>> list = stringRedisTemplate.opsForStream().read(Consumer.from("g1", "c1"),StreamReadOptions.empty().count(1),StreamOffset.create(queueName, ReadOffset.from("0")));//2.判断消息是否获取成功if (list ==null || list.isEmpty()){//获取失败,退出循环break;}//3.解析消息中的订单信息MapRecord<String, Object, Object> entries = list.get(0);Map<Object, Object> value = entries.getValue();VoucherOrder voucherOrder = BeanUtil.fillBeanWithMap(value, new VoucherOrder(), true);//2.创建订单handleVoucherOrder(voucherOrder);//ack确认 ack stream.orders g1 idstringRedisTemplate.opsForStream().acknowledge(queueName,"g1",entries.getId());} catch (Exception e) {log.error("处理pending-list订单异常",e);try {Thread.sleep(20);} catch (InterruptedException ex) {ex.printStackTrace();}}}}}

 

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

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

相关文章

(windows)如何删除删不掉的文件

有时候删除时明明是管理员&#xff0c;却提示需要管理员权限 点击更改-然后再高级 立即查找&#xff0c;搜索当前用户 找到现在的用户名&#xff0c;确定 点击审核&#xff0c;添加--选择主体 高级—选择现在的计算机名——权限完全控制 7.所有对话框点击确定&#…

文件夹删不掉,显示有文件打开怎么办

1 打开任务管理器 2 选中性能 3 点开打开资源监视器 4 点进CPU 5 在输入框输入删除不掉的文件夹名字 6 再右击进程关掉就可

解决:文件名太长删不掉

今天删除一个无用文件夹时windows跳出如下弹窗&#xff1a; 解决方法&#xff1a; 1、在要删除的文件夹同级新建一个空文件夹&#xff08;如图&#xff1a;1是要删除的文件夹&#xff0c;也就是包含那个文件名过长的文件的文件夹&#xff0c;2是空文件夹&#xff09; 2、点下空…

win10系统遇到删不掉的文件夹怎么办

win10系统遇到删不掉的文件夹怎么办&#xff1a; 具体操作步骤如下&#xff1a; 1、打开“此电脑”-“查看”&#xff0c;在“文件扩展名”前打钩&#xff1b; 2、然后在桌面上新建一个txt文本文档&#xff1b; 3、双击打开新建的文本文档&#xff0c;复制粘贴下列的代码&…

删除电脑中删不掉的文件或文件夹

强制删除文件或文件夹 前言一、新建一个文本文件二、打开文本文件1.在文本文件中输入2.保存 前言 在一次拉取git文件&#xff0c;不知道做了什么错误的操作&#xff0c;是的文件夹在删除的时候&#xff0c;一直显示“当前文件不存在”&#xff0c;可是明明就存在我的桌面&…

遇见流氓软件怎么才能卸载,文件夹删不掉显示被占用(小鸟,海螺,原始传奇等),到底应该怎么办?

遇见流氓软件怎么才能卸载&#xff0c;文件夹删不掉显示被占用&#xff08;小鸟&#xff0c;海螺&#xff0c;原始传奇等&#xff09; 首先&#xff0c;描述一下我遇见流氓软件的过程&#xff0c;最开始我想下一个音乐播放器&#xff0c;选择了网易云音乐&#xff0c;在谷歌浏…

服务器上网站文件无法删除不了怎么办啊,Windows服务器上文件夹删不掉怎么办...

我们在用服务器的过程中有的时候会遇到这样的问题&#xff0c;那就是文件夹删除不掉。甚至有的时候需要重启服务器才能删除&#xff0c;甚至还遇到即便重启了服务器也删除不掉文件夹的情况。那么今天纵然云计算小编就带大家来学习一下怎么删除这些删除不掉的文件夹。 那么我们先…

如何删除tmp计算机桌面,temp文件删不掉怎么办

当我们在使用win10系统的时候&#xff0c;会产生系统临时文件&#xff0c;temp文件。如果一直不清理的话&#xff0c;太多的话就会占用系统磁盘空间影响电脑运行速度。但是有小伙伴发现自己电脑的temp文件删不掉不知道怎么办&#xff1f;下面小编就教下大家temp文件怎么删除。 …

空文件夹删不掉打不开,“该项目不存在请确认该项目位置“,“项目正在打开中无法删除“,“文件已损坏或者已经被移动删除“(多种方法图文详解,细节需要注意,以及可能遇到的问题)

1.事前概要-触发这种文件夹的情况 这个删不掉的文件或文件夹其实是Windows系统的祖传bug到目前为止依然没有修复,所以说我们需要通过特别的手段来处理它,听我慢慢讲他的缘由可能会对解决这个问题的帮助更多,会有几种方法,我都试过了的,我把最后一种成功的放在第一个讲,没有成功…

文件夹删不掉

有一天我打开电脑运行我的项目&#xff0c;但发现项目运行不起来额&#xff0c;追查原因的时候发现有一个文件夹损坏&#xff0c;打开这个文件夹&#xff0c;正常&#xff0c;可以浏览里面文件&#xff0c;也可以重命名。右键查看文件夹属性&#xff0c;见其为只读属性&#xf…

服务器空文件夹无法删除怎么办,为什么文件夹删不掉

网民求助&#xff1a;文件夹删不掉,文件夹删不掉怎么办? 相信大家已经发觉自己的系统中有文件夹无法删除后&#xff0c;束手无策的情况下&#xff0c;经常到网上求助&#xff0c;但是许多人给出的方法都不能很好的解决这一问题&#xff0c;因为多种原因都会导致文件夹删不掉情…

win10计算机中删除桌面,win10 电脑桌面文件夹为什么删不掉该如何处理

通常&#xff0c;对于一些没用的文件夹或则资料&#xff0c;大家都会选择把他们删掉的方法来节省电脑空间&#xff0c;但是好多人给白豆芽说&#xff0c;不知道为什么&#xff0c;自己的win10 电脑桌面文件夹总是删不掉&#xff0c;这是怎么回事呢我们又该如何处理呢&#xff1…

计算机app无法删除,文件夹删不掉怎么办?

一、常规解决办法 1&#xff0e;注消或重启电脑&#xff0c;然后再试着删除。 2&#xff0e;进入“安全模式删除”。 3&#xff0e;在纯DOS命令行下使用DEL、DELTREE和RD命令将其删除。 4&#xff0e;如果是文件夹中有比较多的子目录或文件而导致无法删除&#xff0c;可先删除该…

计算机桌面文件删除不掉是怎么了,文件删不掉怎么办?如何删除一个删不掉的文件?...

删除命令是电脑操作常用命令之一&#xff0c;像是上网所产生的垃圾&#xff0c;亦或者不再使用的文件我们都可以通过删除命令把它彻底的从我们电脑中移除&#xff0c;以便释放我们电脑的空间&#xff0c;提高运行速度。但是难免会有些顽固的文件或者文件夹硬是赖在这里不肯走&a…

usmile笑容加新品发布,可视化定义电动牙刷未来发展路径?

历经20余年的发展&#xff0c;中国电动牙刷市场以外资品牌入华为肇始&#xff0c;到目前已经呈现出品牌林立、供给丰富&#xff0c;且国产品牌开始后来者居上的局面。 但近年来行业高速发展的势头似乎有所收敛&#xff0c;与此同时&#xff0c;市场还具备广阔的可拓展空间。数…

南山村又一个旧改项目即将开工建设,桂庙新村城市更新单元。

5月22日&#xff0c;深圳市南山区城市更新和土地整备局发布关于粤海街道桂庙新村城市更新单元项目实施主体确认的公示。 根据公告&#xff0c;该项目实施方式为与权利主体签订搬迁补偿协议&#xff0c;补偿方式为产权置换和货币补偿相结合&#xff0c;已完成100%签约&#xff0…

网络隔离的生物制药企业,怎样实现安全的跨网文件交换?

在数字时代&#xff0c;生物制药企业结合现代技术追求和实现生物科技领域上的突破&#xff0c;研发及生产出更多满足人体健康需求的药物及医疗技术。由于生物制药企业&#xff0c;在进行某一领域的科研时通常周期较长、且涉及很多创新性成果&#xff0c;因此&#xff0c;科研数…

简单区分单射、满射与双射

利用泛函分析中的定义&#xff0c;设f是集合m到M的一个映射&#xff0c;用f&#xff08;m&#xff09;代表m在映射下的像的全体&#xff0c;如果f&#xff08;m&#xff09;M&#xff0c;则映射f就称满射。如果m中的元素的像一定不同&#xff0c;那么映射f就称单射。如果既是满…

求个大佬帮忙解决一下

我打算在conda里配pytorch环境&#xff0c;但是我创建他就一直这样加载&#xff0c;不知道是什么原因&#xff0c;网上也没找到解决的方法

2k21服务器维护时间,《NBA2K ONLINE 2》2月21日停机更新公告

亲爱的玩家&#xff1a; NBA2KOL2将于2月21日7:00-9:00进行停机更新。服务器停机维护期间&#xff0c;您将不能登录游戏。实际开服时间会因工作进度顺延或提前&#xff0c;开启时间请关注官网公告。 【更新内容】 1.王朝征战赛限时开启 版本更新后&#xff0c;王朝征战赛即将限…