一篇文章学会redis在高并发场景中的应用
以互联网中常见的秒杀系统作为案例
超卖现象的产生
如下图所示,若当前库存为1,用户A 抢到商品,但是此时A还未扣减库存(也即没有修改缓存中的库存量时),B也过来抢商品,由于缓存中的值并未修改所以B也是会抢到商品的,因此就会造成超卖的现象。
@RestController
public class RedisDemoController {
@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){
redissonLock.lock();
int realStock = stock -1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");
System.out.println("扣减成功,剩余库存"+realStock);
}else {
System.out.println("扣减失败,库存不足");
}
return "end"
}
}
ps:上述代码存在超卖现象,此时人们会想到对其进行加锁处理,如下图所示
单点部署超卖现象的避免
如下所示,当用户A进入服务器抢商品的同时对其进行加锁,保证抢商品与删减库存的原子性操作
@RestController
public class RedisDemoController {
@Autowired
private Redisson redisson;
@Autowired
private StringRedisTemplate stringRedisTemplate