Redis 分布式锁设计 —— 分布式锁介绍


分布式系统要访问共享资源,为了避免并发访问资源带来错误,我们为共享资源添加一把锁,让各个访问互斥,保证并发访问的安全性,这就是使用分布式锁的原因。


一个可靠的分布式锁系统,应该满足以下三个最低保障:

  1. 相互排斥。在任何场景下,只能有一个客户端能够持有分布式锁;
  2. 避免死锁。即使已经获取分布式锁的客户端崩溃,其他的客户端也应该能够获取分布式锁;
  3. 高可用性。锁服务(Redis 集群)是高可用的,当一个 Redis 结点出现问题,能够自动切换到另一个 Redis 结点。并且,即使客户端释放锁的代码逻辑出现问题,锁最终会被释放,不会影响其他线程对共享资源的访问。

在满足以上条件下,我们设计的分布式锁还满足以下特性:

  1. 可重入性。一个线程获取分布式锁后,还可以再次获取锁;
  2. 非阻塞。提供非阻塞接口(TryLock),如果获取不到锁,不会无限期等待;
  3. 异步续约,Watch Dog 机制。如果操作共享资源的线程未执行完毕,Watch Dog 会不断地延长锁的过期时间,保证锁不会因为超时而被释放;
  4. 锁失效通知。如果探测到分布式锁失效,能够通知到客户端;
  5. 与本地锁相同的使用机制。分布式锁的使用方法与本地锁相同,提供与本地锁相同的抽象,即多线程争抢同一分布式锁对象的机制;
  6. 对 Redis 服务的低请求量。分布式锁的实现优化了不必要的锁争抢,从而降低 Redis 服务端的压力。

接下来的章节,会根据以上介绍的分布式锁的基本特性,逐步介绍本分布式锁的设计与实现。