Redission实现分布式锁
String lockKey = "product_001";
//获取锁对象,并未加锁
RLock redissonLock = redisson.getLock(lockKey);
try {
// **此时加锁**,实现锁续命功能
redissonLock.lock();
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock", realStock + "");
System.out.println("扣减成功,剩余库存:" + realStock + "");
} else {
System.out.println("扣减失败,库存不足");
}
}finally {
//释放锁
redissonLock.unlock();
}
综上,设计实现分布式锁需要满足一下条件:
1、互斥性;在任意时刻,只有一个客户端能持有锁。
2、不能发生死锁;即使存在一个线程持有锁的期间崩溃而没有主动解锁,也能保证后续其他线程能加锁。
3、加锁和解锁必须是同一个线程。