超卖问题以及重复订单
问题描述
采用Jmeter进行压测时,模拟五个用户开启1000个线程去访问接口。即多个用户重复点击秒杀按钮。
- 问题一:库存出现负数:-39
- 问题二:重复订单 相同用户生成了多个秒杀订单。
产生的多个线程对共享资源进行并发操作,造成并发安全的问题。
解决方案
- 分布式锁 将逻辑代码块使用redis分布式锁变成原子性操作,操作完成之后释放锁,即删除redis的key。采用setnx 如果当前Key值存在则不能创建。
//180秒后自动释放
if(redis.set(mutexKey,"1","ex 180","nx")){
逻辑:查询,判断,更新,创建
redis.delete(mutexKey)