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 相关文章推荐
springboot中一些比较常用的注解总结
Jun 11 Java/Android
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
Springboot中如何自动转JSON输出
Jun 16 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 Java/Android
java中如何截取字符串最后一位
Jul 07 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 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
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
javascript中常用编程知识
2013/04/08 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
详细讲解Python中的文件I/O操作
2015/05/24 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
解决python删除文件的权限错误问题
2018/04/24 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
创意爱尔兰礼物:Creative Irish Gifts
2020/01/29 全球购物
高三毕业生自我鉴定
2013/12/20 职场文书
幼儿园安全责任书
2014/04/14 职场文书
个人求职意向书
2015/05/11 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python