springboot利用redis、Redisson处理并发问题的操作


Posted in Java/Android onJune 18, 2021

一、引入问题

在工作中,遇到的接口基本都是长这样的:

如下为一个库存扣减的接口。从redis中获取库存数量,然后扣减一个数量

springboot利用redis、Redisson处理并发问题的操作

问题这个接口在并发的情况下是有问题,可以用jmeter测试一下(用postman压力测试了一下,没有测出并发问题。网上有的博客说postman没法测试并发)

jmeter设置:100个并发

springboot利用redis、Redisson处理并发问题的操作

打印结果:

springboot利用redis、Redisson处理并发问题的操作

问题很严重呀

解决方案,优化如下:

springboot利用redis、Redisson处理并发问题的操作

jmeter设置:101个并发,stock=100,则正确结果是应该会出现一次“扣减失败,库存不足”

打印如下,没毛病

springboot利用redis、Redisson处理并发问题的操作

二、如上只是单应用的情况,那如果是集群呢,结果会是怎么样?

1、nginx配置

springboot利用redis、Redisson处理并发问题的操作

2、修改本地hosts文件

c:\windows\system32\drivers\etc

springboot利用redis、Redisson处理并发问题的操作

springboot利用redis、Redisson处理并发问题的操作

3、利用idea启动两个应用,端口号分别为8080,8090,idea记得修改启动配置

springboot利用redis、Redisson处理并发问题的操作

jmeter测试:

springboot利用redis、Redisson处理并发问题的操作

两个应用的后台打印:从日志来看,synchronized没有起到作用。毕竟synchronized是JVM级别的,没法对集群的情况进行加锁

springboot利用redis、Redisson处理并发问题的操作

springboot利用redis、Redisson处理并发问题的操作

解决方案:引入今天的大佬,分布式锁:Redisson

代码优化如下:

springboot利用redis、Redisson处理并发问题的操作

jmeter测试:101个线程,库存数量100

springboot利用redis、Redisson处理并发问题的操作

后台打印:

springboot利用redis、Redisson处理并发问题的操作

springboot利用redis、Redisson处理并发问题的操作

springboot利用redis、Redisson处理并发问题的操作

出现了一次扣减失败的情况,运行正常

注意点:注意引入redisson比较新的版本,避免出现一些远程连接断绝的一些问题

源码地址:https://github.com/windyNaruto9833/redis

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
分享一些Java的常用工具
Jun 11 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
Java循环队列与非循环队列的区别总结
Jun 22 Java/Android
springboot集成flyway自动创表的详细配置
Jun 26 Java/Android
用Java实现简单计算器功能
Jul 21 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
InterProcessMutex实现zookeeper分布式锁原理
Mar 21 Java/Android
Spring依赖注入多种类型数据的示例代码
Mar 31 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
利用正则表达式匹配浮点型数据
May 30 Java/Android
Android学习之BottomSheetDialog组件的使用
Jun 21 Java/Android
ConstraintValidator类如何实现自定义注解校验前端传参
SpringBoot项目中控制台日志的保存配置操作
Jun 18 #Java/Android
浅谈@Value和@Bean的执行顺序问题
Jun 16 #Java/Android
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 #Java/Android
SpringBoot生成License的实现示例
Springboot如何使用logback实现多环境配置?
解决tk mapper 通用mapper的bug问题
You might like
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
javascript异步编程的4种方法
2014/02/19 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
Python中join和split用法实例
2015/04/14 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
python sort、sort_index方法代码实例
2019/03/28 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python使用configparser库读取配置文件
2020/02/22 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
Servlet如何得到客户端机器的信息
2014/10/17 面试题
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
演讲稿格式范文
2014/05/19 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
Python+DeOldify实现老照片上色功能
2022/06/21 Python