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源码

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

  1. 分布式锁防止订单重复提交_防止表单重复提交看这里!!!

    要解决重复提交这事,先要知道什么是重复提交 假如用户的网速慢,用户点击提交按钮,却因为网速慢,而没有跳转到新的页面,这时的用户会再次点击提交按钮,举个例子:用户点击订单页面,当点击提交按钮的时候,也许 ...

  2. springboot基础(72):Redisson分布式锁

    文章目录 前言 第一节 入门使用Redisson 第二节 注解形式的分布式锁 1. 分布式锁的注解实现 2. 分析MyRedissonLock注解和使用 传送门 前言 并发执行是比较场景的场景,单机情 ...

  3. redis ,redisson 分布式锁深入剖析

    目录 为什么要用分布式锁? 分布式锁所遵循的原则? redis 分布式锁 redis 原始分布式锁实现 加锁 释放锁 redis 分布式锁存在的问题 redisson  实现分布式锁 redisson ...

  4. redisson分布式锁,实战

    目录 什么时候用分布式锁? 分布式锁入门 超时设置 释放了不是自己加的锁 正确设置锁超时 加解锁代码位置有讲究 实现可重入锁 Redis Hash 可重入锁 主从架构带来的问题 什么是 Redlock ...

  5. Redis:Redisson分布式锁的使用(推荐使用)

    Redis:Redisson分布式锁的使用(生产环境下)(推荐使用) 关键词 基于NIO的Netty框架,生产环境使用分布式锁 redisson加锁:lua脚本加锁(其他客户端自旋) 自动延时机制:启 ...

  6. 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了

    作者 | 李祥    责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...

  7. 年轻人,看看Redisson分布式锁—可重入锁吧!太重要了

    1.引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面试中的宠儿,也是工作中解决一些特定场景下的技术问题的银弹.今天我们就来聊聊这些银弹中的其中一枚 ...

  8. Redis进阶- Redisson分布式锁实现原理及源码解析

    文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...

  9. Redisson分布式锁实战-1:构建分布式锁

    我们现在来到Task类当中,这个方法就是V4了/*** Redisson分布式锁实现* @throws InterruptedException*/ // @Scheduled(cron=" ...

最新文章

  1. \r \r\n \t的区别
  2. KZWFoudation系列之Router的设计
  3. Android之invalid address or address of corrupt block 0xabb494a0 passed to dlfree崩溃解决办法
  4. 大工奥鹏计算机在线作业,大工20春《计算机网络技术》在线作业1题目【标准答案】...
  5. gsonformat插件_吐血推荐珍藏的IDEA插件
  6. WINDOWS下面使用ICE操作记录
  7. c#单纯发送post请求一个URL得到返回值
  8. 深入理解BodyTagSupport,包括SKIP_PAGE, EVAL_PAGE等
  9. python语言-Python语言介绍
  10. c语言程序如何链接到数据库,c语言如何链接到数据库
  11. DeepStream3必须安装Video_Codec_SDK9
  12. 曲线运动与万有引力公式_高中物理公式大全!
  13. excel常用函数大全及示例(一)
  14. 【高等数学笔记】格林公式、高斯公式、斯托克斯公式、场论
  15. 加权平均数的例子_加权平均数公式(加权平均数公式例子)
  16. 古典音乐入门的常见问题
  17. (C)输入一个字符串(串长不超过60),删除字符串中所有的空格符
  18. 引导滤波guideFilter原理推导与实验
  19. 微信小程序正则判断手机号?
  20. Java学习第十二天----方法参数类型以及返回值类型问题、链式编程、package包、权限修饰符、内部类、成员内部类

热门文章

  1. DataGrip离线安装数据库驱动
  2. 固实压缩文件容易损坏_你不知道的压缩软件小技巧1
  3. R中报错:Error :$ operator is invalid for atomic vectors
  4. 百度分享自定义分享案例
  5. Excel小技巧:合并单元格且不丢失数据
  6. doris数据库环境搭建报错(invalid cluster id. ignore)
  7. 自媒体运营是做什么的?自媒体运营是做哪些方面?
  8. 美国商务签证面试经历
  9. 卸载asterisk
  10. java 打印当月日历_74. Java打印当月日历