springboot利用redis、Redisson处理并发问题的操作
一、引入问题
在工作中,遇到的接口基本都是长这样的:
如下为一个库存扣减的接口。从redis中获取库存数量,然后扣减一个数量
问题这个接口在并发的情况下是有问题,可以用jmeter测试一下(用postman压力测试了一下,没有测出并发问题。网上有的博客说postman没法测试并发)
jmeter设置:100个并发
打印结果:
问题很严重呀
解决方案,优化如下:
jmeter设置:101个并发,stock=100,则正确结果是应该会出现一次“扣减失败,库存不足”
打印如下,没毛病
二、如上只是单应用的情况,那如果是集群呢,结果会是怎么样?
1、nginx配置
2、修改本地hosts文件
c:\windows\system32\drivers\etc
3、利用idea启动两个应用,端口号分别为8080,8090,idea记得修改启动配置
jmeter测试:
两个应用的后台打印:从日志来看,synchronized没有起到作用。毕竟synchronized是JVM级别的,没法对集群的情况进行加锁
解决方案:引入今天的大佬,分布式锁:Redisson
代码优化如下:
jmeter测试:101个线程,库存数量100
后台打印:
出现了一次扣减失败的情况,运行正常
注意点:注意引入redisson比较新的版本,避免出现一些远程连接断绝的一些问题
源码地址:https://github.com/windyNaruto9833/redis
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
如何利用Redis锁解决高并发问题详解
redis技术的使用: redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动... redis之所以能解决高并发的原因是它可以直接访问内存,而以往我们用的是数据库(硬盘),提高了访问效率,解决了数据库服务器压力. 为什么redis的地位越来越高,我们为何不选择memcache,这是因为memcache只能存储字符串,而redis存储类型很丰富(例如有字符串.LIST.SET等),memcache每个值最大只能存储1M,存储资源非常有限,十分消耗内
-
使用Redis incr解决并发问题的操作
项目背景: 1.新增问题件工单,工单中有工单编码字段,工单编码字段的规则为 "WT"+yyyyMMdd+0000001. 2.每天的工单生成量是30W,所以会存在并发问题 解决思路: 1.首先乐观的认为redis不会宕机,对应的缓存不会被清除(除非人为操作,人为操作会有独立的补救办法) 2.将工单编码存到缓存中(redis),其值只存"WT"+yyyyMMdd后面的数字部分: 对应的key为:key标识+yyyyMMdd,即每天一个key 3.每次生成工单编码时,先
-
如何使用Redis锁处理并发问题详解
前言 上周"被"上线了一个紧急项目,周五下班接到需求,周一开始思考解决方案,周三开发完成,周四走流程上线,也算是面向领导编程了.之前的项目里面由于是自运维,然后大多数又都赶时间,所以在处理定时任务上面基本都是自己在服务器上添加crontab,而不是让多个实例自己去处理定时任务的并发锁,并且Laravel 5.5开始自带并发锁,我们也快升级了.但是这次项目是Python项目,无奈只能自己实现一下,以下这个方案实现起来非常简单且易于理解. import redis r = redis.Re
-
SpringBoot使用Redisson实现分布式锁(秒杀系统)
前面讲完了Redis的分布式锁的实现,接下来讲Redisson的分布式锁的实现,一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Redis的官方也是建议我们这样去做的.Redisson点我可以直接跳转到Redisson的官方文档. 1.1.引入Maven依赖 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter&l
-
Redis高并发问题的解决方法
本文讲述了Redis高并发问题的解决办法.分享给大家供大家参考,具体如下: redis为什么会有高并发问题 redis的出身决定 redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘.由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题.发生连接超时.数据转换错误.阻塞.客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成. 同时,单线程的天性决定,高并发对同一个键的操作会
-
SpringBoot利用redis集成消息队列的方法
一.pom文件依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 二.创建消息接收者 变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法. @Autowired pub
-
Java利用Redis实现高并发计数器的示例代码
业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信.一个接口一分钟限制多少请求.一个接口一天限制调用多少次等等.使用Redis的Incr自增命令可以轻松实现以上需求.以一个接口一天限制调用次数为例: /** * 是否拒绝服务 * @return */ private boolean denialOfService(String userId){ long count=JedisUtil.setIncr(DateUtil.getDate()+"&"+user
-
Springboot利用Redis实现接口幂等性拦截
目录 前言 正文 实战开始 核心三件套 工具类三件套 REDIS配置类 前言 近期一个老项目出现了接口幂等性 校验问题,前端加了按钮置灰, 依然被人拉着接口参数一顿输出,还是重复调用了接口,小陈及时赶到现场,通过复制粘贴,完成了后端接口幂等性调用校验. 以前写过一篇关于接口简单限流防止重复调用的,但是跟该篇还是不一样的,该篇的角度是接口和参数整体一致才当做重复. 简单限流:Springboot使用redis实现接口Api限流的实例 该篇内容: 实现接口调用的幂等性校验 方案 :自定义注解+red
-
springboot利用redis、Redisson处理并发问题的操作
一.引入问题 在工作中,遇到的接口基本都是长这样的: 如下为一个库存扣减的接口.从redis中获取库存数量,然后扣减一个数量 问题这个接口在并发的情况下是有问题,可以用jmeter测试一下(用postman压力测试了一下,没有测出并发问题.网上有的博客说postman没法测试并发) jmeter设置:100个并发 打印结果: 问题很严重呀 解决方案,优化如下: jmeter设置:101个并发,stock=100,则正确结果是应该会出现一次"扣减失败,库存不足" 打印如下,没毛病 二.如
-
SpringBoot整合Redis的示例
redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度非常快,据测试,redis读的速度是110000次/s,写的速度是81000次/s 本节介绍SpringBoot引入redis,以及使用RedisTemplate来操作redis数据. 采用SpringBoot 2.1.9.RELEASE,对应示例代码在:https://github.com/lao
-
SpringBoot整合Redis、ApachSolr和SpringSession的示例
本文介绍了SpringBoot整合Redis.ApachSolr和SpringSession,分享给大家,具体如下: 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多繁琐的配置.SpringBoot整合Druid.Mybatis已经司空见惯,在这里就不详细介绍了.今天我们要介绍的是使用SpringBoot整合Redis.ApacheSolr和SpringSession. 二.SpringBoot整合Redis Redis是大家比
-
关于SpringBoot 使用 Redis 分布式锁解决并发问题
目录 问题背景 解决方案 主要实现原理: 可靠性: SpringBoot 集成使用 Redis 分布式锁 使用示例 参考文档 问题背景 现在的应用程序架构中,很多服务都是多副本运行,从而保证服务的稳定性.一个服务实例挂了,其他服务依旧可以接收请求.但是服务的多副本运行随之也会引来一些分布式问题,比如某个接口的处理逻辑是这样的:接收到请求后,先查询 DB 看是否有相关的数据,如果没有则插入数据,如果有则更新数据.在这种场景下如果相同的 N 个请求并发发到后端服务实例,就会出现重复插入数据的情况:
-
SpringBoot利用注解来实现Redis分布式锁
目录 一.业务背景 二.分析流程 加锁 超时问题 解决方案:增加一个「续时」 三.设计方案 四.实操 相关属性类配置 核心切面拦截的操作 五.开始测试 六.总结 一.业务背景 有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响. 二.分析流程 使用 Redis 作为分布式锁,将锁的状态放到 Redis 统一维护,解决集群中单机 JVM 信息不互通的问题,规定操作顺序,保护用户的数据正确. 梳理设计流程 新建注解 @interface
随机推荐
- AngularJS 指令的交互详解及实例代码
- Shell命令批量修改图片文件名
- Windows下写一个文件备份脚本(专用备份的)
- Java 多线程实例详解(三)
- javacript获取当前屏幕大小
- java实现清理DNS Cache的方法
- python网络编程学习笔记(二):socket建立网络客户端
- 原生js简单实现放大镜特效
- mysql关联子查询的一种优化方法分析
- PHP实现批量检测网站是否能够正常打开的方法
- 使用mysqladmin检测MySQL运行状态的教程
- 关于SQL 存储过程入门基础(流程控制)
- 基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
- Javascript中匿名函数的调用与写法实例详解(多种)
- JS简单实现元素复制示例附图
- 通过Nginx服务器获取大文件MD5值的配置方法
- 分享一下8年C++面向对象设计的经验体会
- spring mybatis多数据源实例详解
- C#保存图片到数据库并读取显示图片的方法
- C语言中static的作用及C语言中使用静态函数有何好处