防止死锁,一定要给锁加过期时间
指令方式: set lock 111 ex 20 nx
get lock
ttl lock
@Autowired private StockMapper stockMapper; /** * redisTemplate */ //StringRedisTemplate 和 RedisTemplate 序列化器不同 @Autowired private StringRedisTemplate redisTemplate; //redis的乐观锁保证了线程安全,但是效率比较慢,而且还会因为机器的性能问题,导致连接不够用,所以不推荐使用redis的的乐观锁 public void deduct() { //加锁setnx (既可以防止死锁,又可以保证原子性) Boolean lockFirst = this.redisTemplate.opsForValue().setIfAbsent("lock", "111",3, TimeUnit.SECONDS); // while(!lockFirst){ try { Thread.sleep(50); } catch (InterruptedException e) { throw new RuntimeException(e); } } try { // 1.查询库存信息 String stock = redisTemplate.opsForValue().get("stock").toString(); //2.判断库存是否充足 if (stock != null && stock.length() != 0) { Integer st = Integer.valueOf(stock); if (st > 0) { //扣减库存 redisTemplate.opsForValue().set("stock", String.valueOf(--st)); } } } finally { //解锁 this.redisTemplate.delete("lock"); } }