NOTE
1.2 如何实现分布式锁
1. 什么是分布式锁 分布式环境(跨进程或者机器)的锁 满足以下条件 - 原子性 加锁和解锁的操作必须是原子的 - 互斥 在任意时刻,只有一个客户端能持有锁 - 无死锁 即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁 - 加锁和解锁必须是同一客户端 加锁和解锁必须是同
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么是分布式锁
分布式环境(跨进程或者机器)的锁 满足以下条件
- 原子性 加锁和解锁的操作必须是原子的
- 互斥 在任意时刻,只有一个客户端能持有锁
- 无死锁 即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁
- 加锁和解锁必须是同一客户端 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了 比如这样的场景,A加锁,锁的持有时长为10s,但是A实际运行了15s,那么锁自动释放;然后B加锁成功,到了第15s,A执行完毕释放锁,那么在这里就是A释放了B加的锁
2. 为什么需要分布式锁
各种语言内置的锁,比如Java的synchronized、Go的mutex只能保证单个进程内部的锁特性,无法跨进程或者机器
3. 如何实现分布式锁
3.1. Zookeeper
3.2. Redis
3.3. Zookeeper vs Redis
| Redis | Zookeeper | |
|---|---|---|
| 加锁失败 | 需要不停的主动轮询 | 注册个监听器等待回调即可 |
| 加锁的客户端挂了 | 等待超时时间过了才能继续加锁 | 临时节点自动释放锁 |
| 性能 | 高 | 低 |