分布式锁,进程间并发控制的一种方式,实现悲观锁,有2个要求:

  1. 任何时刻,一个锁只能被一个客户端持有
  2. 当持有锁的客户端崩溃、出现分区,最终总能获得锁

    1 Redis 实现

    1.1 单实例 redis

    获取锁

    1. SET key random NX EX 3
    2. # random 客户端生成随机值,释放锁时有用
    3. # NX 当 key 不存在时设置
    4. # EX 超时 3 秒
    另开一个 watchdog 线程,定期监控获取到锁的执行线程,如果正常,使用 EXPIRE 续期。

    释放锁

    执行 Lua 脚本(保证原子性),检查 key 的 value,如果和 random 相同才能 DEL。

    2 ZooKeeper 实现

    2.1 非公平锁

    各 client 创建同一个临时节点,创建成功的 client 获得锁,其余监听。
    牧群效应(Herd),当释放锁时,通知了很多 client 竞争锁,但只有1个能成功,其余做了无用功。

    2.2 公平锁

    各 client 在加锁时创建临时顺序节点,序列号最小的获得锁,其余 watch 比自己序列号小的上一个节点,等待释放。
    curator 采用了该方案,没有牧群效应。

    参考文献