Redisson 分布式锁
阻塞式等待 ( 续长30s )
1) 锁的自动续期,如果业务超长,运行期间自动给锁续上新的30s
2) 加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s以后自动删除
@Controller
public class IndexController {
@Autowired
RedissonClient redisson;
@ResponseBody
@GetMapping("/hello")
public String hello() {
// 1、获得一把锁,只要锁的名字一样,就是同一把锁
RLock lock = redisson.getLock("my-lock");
// 2、加锁 (重要1)
lock.lock(); // 阻塞式等待
// 1) 锁的自动续期,如果业务超长,运行期间自动给锁续上新的30s
// 2) 加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s以后自动删除
try {
System.out.println("加锁成功,z之行业务。。。"+Thread.currentThread().getId());
Thread.sleep(15000);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 3、解锁 (重要2)
lock.unlock();
// 问题:将解锁代码没有之行,redisson 会不会出现死锁
System.out.println("释放锁。。。"+Thread.currentThread().getId());
}
return "hello";
}
}
模拟 分布式锁
1、开启2个相同的微服务
2、模拟并发
开启2个浏览器,同时请求微服务