✅P160_缓存-分布式锁-Redisson-lock锁测试
大约 2 分钟
Redisson锁测试
代码
cfmall-product/src/main/java/com/gyz/cfmall/product/web/IndexController.java
@ResponseBody
@GetMapping("/hello")
public String hello() {
//1、获取一把锁,只要锁的名字一样,就是同一把锁
RLock lock = redissonClient.getLock("my-lock");
//2、加锁
lock.lock();//阻塞式等待。默认加的锁都是30s时间
// 1)锁的自动续期,如果业务超长,运行期间自动给锁续上新的30s。不用担心业务时间长,锁自动过期被删掉
// 2)加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s以后自动删除
try {
System.out.println("加锁成功,执行业务..." + Thread.currentThread().getId());
Thread.sleep(30000);
} catch (Exception e) {
} finally {
//3、解锁,假设解锁代码没有运行,redisson会不会出现死锁
System.out.println("释放锁..." + Thread.currentThread().getId());
lock.unlock();
}
return "hello";
}
逻辑
同时开启8081、8082两个商品服务:
- 假设8081先抢到锁,它先执行业务,此时8082则是在外面等待,直到8081释放锁之后,8082才抢到了锁,等8082执行完,然后才释放锁
- 假设还是8081先抢到锁,它在执行业务期间宕机了,没有释放锁,我们发现8082会一直在外面等待,最终抢到锁,然后执行业务,再释放锁,并没有出现死锁的现象。
测试
我们发现Redisson内部的lock()实现,里面有一个死循环,会一直去获取锁。
- lock()是阻塞式等待,默认加的锁都是30s时间
- 如果执行业务时间过长,运行期间Redisson会给锁自动续期,每次都会续上30s,不会因为业务时间过长,导致锁自动删掉
- 等业务执行完,就不会给当前锁续期,即使不手动释放锁,锁也会在30s以后自动删除