面试题答案
一键面试1. Redlock算法
- 原理:Redlock算法通过向多个独立的Redis实例获取锁。假设存在N个Redis实例(一般N取奇数,如5),客户端需要向这N个实例依次发送获取锁的请求。当客户端成功从超过半数(
(N / 2) + 1
)的实例获取到锁时,才认为成功获取到分布式锁。 - 优点:在网络分区的情况下,即便部分Redis实例不可达,只要仍有超过半数的实例能正常响应并获取锁,就能保证锁的正确性。例如,5个实例中有2个实例所在网络分区与客户端隔离,但只要另外3个实例能获取锁,整个锁获取过程仍有效。
- 缺点:增加了Redis实例数量,提高了运维成本;获取锁时需要多次网络请求,性能有所下降。
2. 时钟同步与锁有效期
- 时钟同步:
- 原理:确保所有参与分布式锁的节点(包括Redis实例和客户端)时钟保持同步。可以使用网络时间协议(NTP)来定期校准系统时钟。
- 作用:在网络分区时,由于时钟同步,各个节点对于锁的有效期判断一致。若一个客户端在某个分区获取锁并设置了有效期,其他分区的节点能基于同步的时钟准确判断锁是否过期,避免因时钟差异导致锁的误判。
- 锁有效期:
- 原理:设置合理的锁有效期。获取锁时,为锁设置一个较短且合适的有效期。
- 作用:在网络分区导致部分节点无法通信时,即使持有锁的客户端在分区内与其他节点隔离,锁的有效期一到,其他节点就能重新获取锁,从而减少资源争用的时间。例如,将锁有效期设置为10秒,若客户端获取锁后网络分区发生,10秒后锁自动失效,其他节点可重新竞争锁。
3. 续租机制
- 原理:客户端在获取锁后,开启一个后台线程定期对锁进行续租操作。当检测到网络分区恢复时,也及时进行续租。续租操作通过向Redis发送特定命令延长锁的有效期。
- 优点:在网络分区期间,若客户端在分区内一直持有锁,通过续租可避免锁过期被其他客户端获取,从而防止资源争用。例如,客户端获取锁后网络分区,后台线程继续在分区内对锁进行续租,网络恢复后,该锁仍为该客户端持有,避免其他客户端误获取锁。
- 缺点:增加了客户端实现的复杂度,需要额外的线程和逻辑来管理续租操作。
4. 基于租约的锁机制
- 原理:客户端获取锁时,Redis返回一个租约(Lease)。租约包含锁的持有者信息和有效期等内容。客户端在每次操作前,先验证租约是否有效。
- 优点:在网络分区时,即使部分Redis实例不可达,客户端基于本地持有的租约仍可在有效期内继续操作,减少因网络分区导致的锁误判。例如,网络分区后,客户端凭借租约继续执行操作,只要租约不过期,就不会认为锁失效,避免重新获取锁带来的资源争用。
- 缺点:需要额外的逻辑来管理租约,如验证、更新租约等,增加了系统复杂度。