面试连环炮系列(十九):分布式锁的实现方案

  1. 分布式锁的实现方案?
    相比单例锁,分布式锁须要解决的问题:
    • 互斥性:任意时刻只能有一个客户端拥有锁,不能同时多个客户端获取。
    • 安全性:锁只能被持有该锁的用户删除,而不能被其余用户删除。
    • 死锁:获取锁的客户端由于某些缘由而宕机,而未能释放锁,其余客户端没法获取此锁,须要有机制来避免该类问题的发生。
    • 容错:当部分节点宕机,客户端仍能获取锁或者释放锁。

    经常使用的方案是基于Redis集群的锁实现,经常使用的Java组件是Redission。它对Redis分布式锁的实现很是完善,实现可重入锁、读写锁、公平锁、信号量、CountDownLatch等不少种复杂的锁的语义,知足咱们对分布式锁的不一样层次的需求。html

  2. 主从模式下节点宕机可能致使锁失效,Redission怎么解决的
    Redission实现了Redlock算法解决这个问题。算法

  3. 说说Redlock算法的原理
    假设咱们有5个Redis master实例:
    1. 客户端获取服务器当前的的时间t0,毫秒数。
    2. 使用相同的key和value依次向5个实例获取锁。客户端在获取锁的时候自身设置一个远小于业务锁须要的持续时间的超时时间。举个例子,假设锁须要10秒,超时时间能够设置成好比5-50毫秒。这个避免某个Redis自己已经挂了,可是客户端一直在尝试获取锁的状况。超时了以后就直接跳到下一个节点。
    3. 客户端经过当前时间(t1)减去t0,计算获取锁所消耗的时间t2(t1-t0)。只有t2小于锁的业务有效时间(也就是第二步的10秒),而且,客户端在至少3(5/2+1)台上获取到锁咱们才认为锁获取成功。
    4. 若是锁已经获取,那么锁的业务有效时间为10s-t2。
    5. 若是客户端没有获取到锁,多是没有在大于等于N/2+1个实例上获取锁,也多是有效时间(10s-t2)为负数,咱们就尝试去释放锁,即便是并无在那个节点上获取到。
  4. Redlock算法有什么缺点吗?
    时间误差在分布式系统中很常见,在锁有效时间里虽然减去了时钟偏移,可是这个值不太好肯定。Redis做者也建议对锁互斥的安全性要求高的应用不要使用这个算法。安全

参考(部分摘抄的文字版权属于原做者):

https://www.jianshu.com/p/47fd7f86c848
https://www.jianshu.com/p/2d3bf2ff2315
http://www.javashuo.com/article/p-finiuwht-gu.html
http://www.javashuo.com/article/p-zqbofysm-gu.html服务器

相关文章
相关标签/搜索