高并发的情况下订单超卖/秒杀问题
这里的问题就是在同一时间发过来了两个请求。这两个用户购买同一件数量的商品。线程之间没有互斥。也就是你运行你的。我运行我的。导致在线程1还未实际扣除库存的时候。线程2也获取到了和线程1相同的数量的商品。它两同时扣除库存。这样就出现了订单超卖的问题!!!
解决订单超卖/秒杀的办法
分布式锁
分布式锁就是在多个服务集群的模式下 每个服务下的线程可以做到互斥的效果 这就是分布式锁 并且分布式锁还要达到 高性能 高可见 高互斥 高可用 这样才叫分布式锁
SETNX的作用
setnx就是使用redis实现分布式锁的一种方式 它的特点就是当有重复的锁key查询缓存就会返回false 或者空 那我们就可以利用它这种机制去实现多个服务同时调用同一个方法让所有服务都有互斥的效果
代码实现创建锁
private final static String SUO_KEY = "cs:suo:";
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 获取锁
* je: 订单唯一ID
* @return
*/
public boolean huoqu(Long je) {
// 生成uuid 做锁的value
String uuid = UUID.randomUUID().toString();
// stringRedisTemp