分布式锁实现
基于Redis的实现(AP)
基本实现
1 | SETNX resource_name random_value PX 30000 |
问题1:A线程业务逻辑执行较长B线程也进入加锁成功,B释放锁的是A线程的锁
锁安全解决方案:random_value要全局唯一,一般会用请求ID设置,释放锁要用random_value来做释放;规则:谁加锁谁释放
问题2:业务执行时间超出了锁设置的过期时间,导致客户端同时执行
启动一个锁超时的守护线程,根据当前线程的执行进度开启一个守护线程自动续约锁的超市时间
问题3:Redis的单点故障引起的主从切换问题
1
2
3生产中redis一般是主从模式,主节点挂掉时,从节点会取而代之,客户端上却并没有明显感知。原先第一个客户端在主节点中申请成功了一把锁,但是这把锁还没有来得及同步到从节点,主节点突然挂掉了。然后从节点变成了主节点,这个新的节点内部没有这个锁,所以当另一个客户端过来请求加锁时,立即就批准了。这样就会导致系统中同样一把锁被两个客户端同时持有,不安全性由此产生。
不过这种不安全也仅仅是在主从发生 failover 的情况下才会产生,而且持续时间极短,业务系统多数情况下可以容忍