-
加锁的过程或者行为应该是怎么样的
获取锁,如果成功则返回,不成功则阻塞,等待其他竞争者释放锁后重新获取。
-
分布式锁会存在哪些问题,如何解决
分布式锁实现,一般会有一个锁超时机制。主要是避免持有锁的节点挂掉,从而导致死锁问题。但是,存在锁超时机制,那么相应的,也会引入一些其他问题
比如,超时时间如何设置?设置过小,业务过程没有执行完成,那么会导致一致性问题。设置过大,节点挂掉的话,会使其他等待获取锁的节点不能第一时间获取锁。
如何解决? 可以参考redission,一般做法,都是起一个守护线程来延迟锁时长。在锁快超时的时候,业务没有执行完,那么就相应的延迟锁的过期时间。
-
redis节点挂掉,或者主从切换时,如何保证分布式锁正常使用
对于单节点或者单节点主从部署的。目前是没有很好的解决办法的。redis采用的是ap,只确保高可用。因此,发生主从切换时,锁不一致的问题肯定是存在的。
这里可以采用官方推荐的RedLock来实现。不过需要部署多个Redis服务。相对而言,是比较复杂的。对于RedLock来说,本质是基于多个Redis实例,实现了一个类raft的算法。
因此,在某些需要强一致性的业务场景中。还是使用zookeeper比较好的。