Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)
Jmeter+Springboot+Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)
涉及知识点:
java+springboot+mybatis开发
redis分布式锁+Redisson客户端
Jmeter各种骚操作:用户变量、随机取值、jdbc操作、if else操作、循环、控制器、beanshell断言等等
- 环境工具:
idea、jmeter
jdk1.8、maven、mysql、redis
三台服务器:两个4C16G服务节点+一个台nginx(淘宝的tengine-2.3.0)节点
- 思路概要:
(1) 主要提供四个接口:下单、取消、出库、添加库存,四种操作在操作库存表t_stock_demo行的时候都需要添加Redis的锁,使用:
Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);
(2) 另外取消和出库,因为是用Jmeter直接查询数据库获取可用的订单数量,为防止统一订单重复操作在RestSevice层使用订单号orderNo做了一层Redis分布式锁,订单已在操作直接返回结果。
(3) 使用jmeter的jdbc操作+函数、随机数获取已确认的订单结合if控制器判断结果,进行取消和出库操作
(4) 划重点:使用分布式锁和本地事物,一定要先提交事物再释放锁、先提交事物再放锁、先提交事物再放锁
- SQL、jmeter脚本、jar包启动脚本请到doc目录查看。
- 操作指南:
(1) git clone https://github.com/Xlinlin/SpringCloud-Demo
(2) cd SpringCloud-Demo/SpringBoot-Stock-Demo
(3) 配置数据mysql和redis配置,application.yml文件,(自行准备mysql、redis环境)
(4) mvn install
(5) 拷贝stock_demo.jar和doc/bootstrap.sh到 linux服务器(自行准备java环境)上
(6) 适当修改bootstrap.sh脚本目录,保持与springboot包在同一目录,直接执行脚本:
./bootstrap start
(7) 查看进程、端口是否启动:
jps 或 ps -ef|grep stock_demo 或 lsof -i:7878
(8) 配好nginx跳转
(9) 下载jmeter ,解压进入jmeter目录,双击:ApacheJMeter(10) 文件->打开->找到doc下的.jmx文件,大概的画面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HF7yCU8S-1571799492489)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_demo_jmeter.jpg?raw=true)]
(11) 修改远程服务器地址信息为你的nginx服务
(12) 修改你的数据地址,此处需要将mysql的驱动jar包引入jmeter/lib目录下
(13) 线程、参数、请求调整好后,然后点击启动(Ctrl+R)
部分截图:
(14) 后台日志[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4S3U8W0-1571799492490)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/sever_console_log.jpg?raw=true)]
(15) 库存表[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XpEUFhgD-1571799492490)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_query.jpg?raw=true)]
(16) 订单表[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aw1Y1btL-1571799492491)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/order_query.jpg?raw=true)] - 遗留一个业务问题:
总库存(Total) = 可用库存(Ava) + 预占库存(Prev)
A:下单:T A- P+
B:取消:T A+ P-
C:出库:T- A P-
D:同步库存+:T+ A+ P
E:同步库存-:T- A- P
如果仅仅只是 A+B 或者 A+C 或A B C并发跑能保证 T=P+A
但是 A +B+C+D +E 并发跑,就一定会出现 打破这个 T=P+A的平衡,这个要业务逻辑要怎么处理?有大佬解答?
GitHub源码
Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)相关推荐
- 分布式锁防止订单重复提交_防止表单重复提交看这里!!!
要解决重复提交这事,先要知道什么是重复提交 假如用户的网速慢,用户点击提交按钮,却因为网速慢,而没有跳转到新的页面,这时的用户会再次点击提交按钮,举个例子:用户点击订单页面,当点击提交按钮的时候,也许 ...
- springboot基础(72):Redisson分布式锁
文章目录 前言 第一节 入门使用Redisson 第二节 注解形式的分布式锁 1. 分布式锁的注解实现 2. 分析MyRedissonLock注解和使用 传送门 前言 并发执行是比较场景的场景,单机情 ...
- redis ,redisson 分布式锁深入剖析
目录 为什么要用分布式锁? 分布式锁所遵循的原则? redis 分布式锁 redis 原始分布式锁实现 加锁 释放锁 redis 分布式锁存在的问题 redisson 实现分布式锁 redisson ...
- redisson分布式锁,实战
目录 什么时候用分布式锁? 分布式锁入门 超时设置 释放了不是自己加的锁 正确设置锁超时 加解锁代码位置有讲究 实现可重入锁 Redis Hash 可重入锁 主从架构带来的问题 什么是 Redlock ...
- Redis:Redisson分布式锁的使用(推荐使用)
Redis:Redisson分布式锁的使用(生产环境下)(推荐使用) 关键词 基于NIO的Netty框架,生产环境使用分布式锁 redisson加锁:lua脚本加锁(其他客户端自旋) 自动延时机制:启 ...
- 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了
作者 | 李祥 责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...
- 年轻人,看看Redisson分布式锁—可重入锁吧!太重要了
1.引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面试中的宠儿,也是工作中解决一些特定场景下的技术问题的银弹.今天我们就来聊聊这些银弹中的其中一枚 ...
- Redis进阶- Redisson分布式锁实现原理及源码解析
文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...
- Redisson分布式锁实战-1:构建分布式锁
我们现在来到Task类当中,这个方法就是V4了/*** Redisson分布式锁实现* @throws InterruptedException*/ // @Scheduled(cron=" ...
最新文章
- \r \r\n \t的区别
- KZWFoudation系列之Router的设计
- Android之invalid address or address of corrupt block 0xabb494a0 passed to dlfree崩溃解决办法
- 大工奥鹏计算机在线作业,大工20春《计算机网络技术》在线作业1题目【标准答案】...
- gsonformat插件_吐血推荐珍藏的IDEA插件
- WINDOWS下面使用ICE操作记录
- c#单纯发送post请求一个URL得到返回值
- 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
- python语言-Python语言介绍
- c语言程序如何链接到数据库,c语言如何链接到数据库
- DeepStream3必须安装Video_Codec_SDK9
- 曲线运动与万有引力公式_高中物理公式大全!
- excel常用函数大全及示例(一)
- 【高等数学笔记】格林公式、高斯公式、斯托克斯公式、场论
- 加权平均数的例子_加权平均数公式(加权平均数公式例子)
- 古典音乐入门的常见问题
- (C)输入一个字符串(串长不超过60),删除字符串中所有的空格符
- 引导滤波guideFilter原理推导与实验
- 微信小程序正则判断手机号?
- Java学习第十二天----方法参数类型以及返回值类型问题、链式编程、package包、权限修饰符、内部类、成员内部类