1. 为什么需要分布式锁

多线程多个线程竞争会导致系统出现问题，需要对资源实现互斥访问，分布式系统下的悲观锁

2. 分布式锁需要具备的条件

- 互斥
- 高可用性
- 可重入
- 高性能
- 非阻塞

3. 分布式锁的实现方案

- 基于 mysql 实行

- 基于分布式协调服务 ZooKeeper 实现

基于**临时顺序节点**和**Watcher（事件监听器）**

- 基于分布式键值存储系统 Redis 实现

`SETNX（set if not exist）key value EX 3` 过期时间 3s

`DEL key`，建议使用 Lua 脚本来通过 key 对应 value（唯一值）判断

需要保证 key 值和过期时间为一个原子操作，否则无法释放

锁的续期使用 Redission 实现，提供了一个专门监控和续期锁的看门狗，如果未执行完就延长锁的过期时间
RLock lock = redission. get ("lock")
lock. lock ()
lock. unlock ()

集群下分布式锁的可靠性

通过 RedLock 算法解决，让客户端向集群中多个独立的 Redis 依次申请枷锁，半数以上的实例加锁成功才是获得分布式锁 