Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

2023-11-19

Jmeter+Springboot+Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

涉及知识点:

java+springboot+mybatis开发

redis分布式锁+Redisson客户端

Jmeter各种骚操作:用户变量、随机取值、jdbc操作、if else操作、循环、控制器、beanshell断言等等

  1. 环境工具:

    idea、jmeter

    jdk1.8、maven、mysql、redis

    三台服务器:两个4C16G服务节点+一个台nginx(淘宝的tengine-2.3.0)节点
  2. 思路概要:

    (1) 主要提供四个接口:下单、取消、出库、添加库存,四种操作在操作库存表t_stock_demo行的时候都需要添加Redis的锁,使用:Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);

    (2) 另外取消和出库,因为是用Jmeter直接查询数据库获取可用的订单数量,为防止统一订单重复操作在RestSevice层使用订单号orderNo做了一层Redis分布式锁,订单已在操作直接返回结果。

    (3) 使用jmeter的jdbc操作+函数、随机数获取已确认的订单结合if控制器判断结果,进行取消和出库操作

    (4) 划重点:使用分布式锁和本地事物,一定要先提交事物再释放锁、先提交事物再放锁、先提交事物再放锁

  3. SQL、jmeter脚本、jar包启动脚本请到doc目录查看。
  4. 操作指南:

    (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)]

  5. 遗留一个业务问题:

    总库存(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源码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存) 的相关文章

随机推荐

  • 2023最新骚扰电话查询接口

    一 原始方法注入数据 初始化方法 constructor token this token Z1QljZOZiT4NTG 请求地址 this req url http api txapi cn v1 c nuisance calls que
  • Redis系列二

    1 4 Redis基础知识 1 4 1 默认数据库 Redis默认数据库数量有16个 redis conf配置文件可查看 默认使用的数据库为0 1 4 2 切换数据库 使用select 命令进行切换 root yunmx bin redis
  • C++ 信号处理

    信号是由操作系统传给进程的中断 会提早终止一个程序 在 UNIX LINUX Mac OS X 或 Windows 系统上 可以通过按 Ctrl C 产生中断 有些信号不能被程序捕获 但是下表所列信号可以在程序中捕获 并可以基于信号采取适当
  • ytb网站报错 “您没有联网,请检查网络连接”

    问题原因 解决办法 计算机时间有问题 在设置中 同步 时间 并且关闭路由器的Ipv6以绝后患 xxxxxxx com core proxy vmess encoding failed to read response header gt w
  • Matlab与VC混合编程之一

    Matlab与VC混合编程之一 1 问题的提出 为什么需要用Matlab与VC混合编程 做工程项目时用的是VC 经常会用到科学计算的相关算法 比如矩阵求逆 求行列式 求微分方程组初值问题的数值解等问题 如果自己去编写相关的函数 首先需要去找
  • windows线程调度、线程优先级和亲缘性

    windows线程调度 线程优先级和亲缘性 每一个线程在它的线程内核对象中有一个上下文结构 反映了线程最后一次执行的 CPU 寄存器状态 每隔大约 20ms 可以使用 GetSystemTimeAdjustment 获得 我测得这个间隔大约
  • android调节系统音量之修改默认音量、最大音量和最小音量

    Android系统拥有多种声音属性 包括有多媒体 通话 通知等声音属性 这些声音属性分别含有自己默认音量 最大音量和最小音量属性 下面我将介绍一下这些声音属性的音量定义和它们的修改方式 默认音量 系统声音的默认音量定义在 framework
  • ZCMU--2219: Toy Army(C语言)

    The hero of our story Valera and his best friend Arcady are still in school and therefore they spend all the free time p
  • SpringBoot 接受文件和对象

    SpringBoot 接受文件和对象 使用场景 某个接口 需要同时接受文件和实体 也就是参数 一 这个时候 前端就不能 json 格式传送数据了 要用到 multipart form data 这种格式传送数据 二 那么 这个时候 后端应该
  • Java抛出自定义异常,报java.lang.reflect.UndeclaredThrowableException: null的错误

    最近项目中使用了自定义异常 并做了全局异常处理 抛出异常的代码如下 throw new FebsException 系统管理员不能修改颜色 结果运行后 报java lang reflect UndeclaredThrowableExcept
  • 前端开发时常用的第三方工具库

    前端开发时常用的第三方工具库 JavaScript 实用工具库 一 lodash 1 官方文档 中文文档 https www lodashjs com 2 简介及使用场景 Lodash 是一个一致性 模块化 高性能的 JavaScript
  • windows sqlite可视化工具sqlitestudio下载、安装、使用

    1 下载地址 https sqlitestudio pl index rvt 2 使用 选择数据库 gt 添加数据库 gt 选择你的本地数据库 并点击 增加就可以查看数据库了
  • 浅谈Buffer

    什么是Buffer 在 Node js 中 Buffer 类是随 Node 内核一起发布的核心库 Buffer 库为 Node js 带来了一种存储原始数据的方法 可以让 Node js 处理二进制数据 global Buffer gt f
  • 爬虫小白也能玩转!Python爬虫中的异常处理与网络请求优化

    大家好 我是来自爬虫世界的小编 今天 我要和大家分享一些关于Python爬虫中的异常处理和网络请求优化的经验 不论你是初学者还是有一定经验的爬虫程序员 我相信这些实用的技巧和代码示例都能为你在爬取数据的过程中带来方便和效率 1 异常处理 保
  • MySQL查看、创建和删除索引的方法分享

    这篇文章主要介绍了MySQL查看 创建和删除索引的方法 结合实例形式较为详细的分析了MySQL中索引的作用 以及查看 创建及删除索引的相关实现技巧 具有一定参考借鉴价值 需要的朋友可以参考下 本文实例讲述了MySQL查看 创建和删除索引的方
  • STM32系统时钟超详解

    作者简介 嵌入式入坑者 与大家一起加油 希望文章能够帮助各位 个人主页 rivencode的个人主页 系列专栏 玩转STM32 保持学习 保持热爱 认真分享 一起进步 目录 一 什么是时钟 二 时钟树 1 HSE时钟 2 HSI时钟 3 L
  • Shell变量的设置规则

    1 变量设置规则 变量与变量内容以一个等号 myname LSX 等号两边不能直接接空格 myname LSX 或 myname L SX 都是错误 变量名称只能是英文字母与数字 但是开头字符不能是数字 2myname LSX 错误 2 双
  • 华为od机考真题-数据分类

    while 1 try c b nums list map int input split dp
  • C++11 新特性:模板别名

    C 11 新特性 模板别名 豆子 2012年5月22日 C 没有评论 参考文章 https blogs oracle com pcarlini entry template aliases 2002 年 ISO C 标准化组织就已经提出了模
  • Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

    Jmeter Springboot Redisson分布式锁并发订单操作 下单 取消单 完成单 加库存 涉及知识点 java springboot mybatis开发 redis分布式锁 Redisson客户端 Jmeter各种骚操作 用户