一、高效分布式锁
当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何在高效的设计分布式锁,这里我认为以下几点必须要考虑的。
1.互斥
在分布式高并发的条件下,我们最需要保证,同一时刻只能有1个线程获得锁。
2.防止死锁
分布式非常有必要设置锁的有效时间,确保系统出现故障后,在一定时间内能够主动去释放锁,避免造成死锁的情况
3.性能
对访问量大的共享资源,需要考虑减少锁等待的时间,避免导致大量线程阻塞。
所以在锁的设计时,需要考虑两点
1.锁的颗粒度尽量小
2.锁的范围尽量小
4.重入
同一个线程可以重复拿到同一个资源的锁。重入锁非常有利于资源的高效利用。
二、Redisson原理分析

1.加锁机制
线程去获取锁,获取成功:执行lua脚本,保存数据到redis数据库
线程去获取锁,获取失败:一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis数据库
2.watch dog自动延期机制
线程1业务未执行完,设置的过期时间到了,线程1还想持有锁的话,就会启动一个watch dog后台线程,不断延长锁key的生存时间。
注意:正常这个看门狗线程是不启动的,还有就是这个看门狗启动后对整体性能也会有一定影响,所以不建议开启
3.为啥用lua脚本
通过封装在lua 脚本中发送给redis,而且redis是单线程的,这样就保证这段复杂业务逻辑执行的原子性。
4.可重入加锁机制

5.Redis分布式的缺点
在哨兵模式或者主从模式下,如果master实例宕机的时候,可能导致多个客户端同时完成加锁。
