面试题答案
一键面试Redlock算法基本原理
- 多实例保障可靠性:Redlock算法通过使用多个独立的Redis实例(通常建议至少5个)来提高锁的可靠性。这些实例相互独立,不存在主从关系。这样做的目的是避免单个实例故障导致锁机制失效,因为即使部分实例出现问题,其他正常实例仍能参与锁的获取和释放过程。
- 基于大多数的决策:在加锁时,客户端尝试在大多数(超过一半,例如5个实例中至少3个)Redis实例上获取锁。只有当客户端成功在大多数实例上获取到锁时,才认为加锁成功。这一机制确保了锁的强一致性,因为只有在多数实例确认的情况下,锁才能被视为获取成功,降低了因网络分区等问题导致的锁冲突风险。
加锁流程
- 获取当前时间:客户端首先获取当前的系统时间(以毫秒为单位)。
- 依次尝试加锁:客户端按顺序向每个Redis实例发送加锁请求,请求中包含锁的唯一标识(例如UUID)和锁的过期时间。这个过期时间是为了防止锁在持有方发生故障时永远无法释放。
- 计算加锁耗时:当客户端尝试完所有实例后,再次获取当前时间,计算从开始加锁到结束尝试加锁的总耗时。
- 判断加锁结果:如果总耗时小于锁的过期时间,并且成功在大多数实例上获取到锁,则加锁成功;否则,加锁失败,客户端需要释放已经在部分实例上获取到的锁(通过向这些实例发送解锁请求)。
解锁流程
- 发送解锁请求:客户端向所有加锁时成功获取锁的Redis实例发送解锁请求,请求中包含加锁时使用的唯一标识。
- 实例验证解锁:每个Redis实例在接收到解锁请求后,会验证请求中的唯一标识是否与当前持有的锁标识一致。如果一致,则释放锁;如果不一致,说明该锁可能已经被其他客户端获取,不执行解锁操作。