一、高效分布式锁

当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何在高效的设计分布式锁,这里我认为以下几点必须要考虑的。

1.互斥

在分布式高并发的条件下,我们最需要保证,同一时刻只能有1个线程获得锁。

2.防止死锁

分布式非常有必要设置锁的有效时间,确保系统出现故障后,在一定时间内能够主动去释放锁,避免造成死锁的情况

3.性能

对访问量大的共享资源,需要考虑减少锁等待的时间,避免导致大量线程阻塞。
所以在锁的设计时,需要考虑两点
1.锁的颗粒度尽量小
2.锁的范围尽量小

4.重入

同一个线程可以重复拿到同一个资源的锁。重入锁非常有利于资源的高效利用。

二、Redisson原理分析

Redis分布式锁原理 - Redisson - 图1

1.加锁机制

线程去获取锁,获取成功:执行lua脚本,保存数据到redis数据库

线程去获取锁,获取失败:一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis数据库

2.watch dog自动延期机制

线程1业务未执行完,设置的过期时间到了,线程1还想持有锁的话,就会启动一个watch dog后台线程,不断延长锁key的生存时间。

注意:正常这个看门狗线程是不启动的,还有就是这个看门狗启动后对整体性能也会有一定影响,所以不建议开启

3.为啥用lua脚本

通过封装在lua 脚本中发送给redis,而且redis是单线程的,这样就保证这段复杂业务逻辑执行的原子性。

4.可重入加锁机制

Redis分布式锁原理 - Redisson - 图2

5.Redis分布式的缺点

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