首先看一段模拟扣减库存的代码:
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("test")
@Slf4j
public class TestController {
@Autowired
private Redisson redisson;
@Autowired
private StringRedisTemplate stringRedisTemplate;
//模拟扣减库存业务
@RequestMapping("deduct_stock")
public String deductStock(){
//拿出当前商品的库存
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if(stock>0){
int realStock = stock-1;
//减完当前商品的库存之后 将库存值写回去
stringRedisTemplate.opsForValue().set("stock",realStock+"");
} else{
throw new RuntimeException("库存不足,扣减失败");
}
return "ens";
}
}
以上代码符合秒杀的时候扣减Redis中库存的逻辑,但是在高并发的情况下,会有超卖问题出现。首先想到的是使用加锁的方式。