基于redis实现分布式锁的demo(递归重试)

永远的HelloWorld 2022-09-23 09:14:45 阅读数:354

分布式redisdemo实现分布
 @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");
//重试,递归调用
if (!lockFirst) {
try {
Thread.sleep(50);
deduct();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else {
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");
}
}
}
版权声明:本文为[永远的HelloWorld]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/weixin_43882788/article/details/127003261