分布式锁实现和选择
分布式锁是分布式系统中的重要组件,理解各种实现方式对于设计分布式系统至关重要。
核心问题
为什么需要分布式锁?
- 多进程/多服务器环境
- 保证资源互斥访问
- 避免数据不一致
分布式锁的实现方式
1. Redis分布式锁
实现方式:
java
SET key value NX EX timeout问题:
- 锁过期时间设置困难
- 锁误释放(其他线程释放)
- 主从切换导致锁丢失
解决方案:
- RedLock算法
- 使用Lua脚本保证原子性
- 设置唯一标识
2. Zookeeper分布式锁
实现方式:
- 创建临时顺序节点
- 判断是否为最小节点
- 监听前一个节点
优点:
- 可靠性高
- 支持公平锁
- 自动释放
缺点:
- 性能较低
- 依赖Zookeeper
3. 数据库分布式锁
实现方式:
sql
INSERT INTO lock_table (lock_key) VALUES ('key');优点:
- 实现简单
- 可靠性高
缺点:
- 性能较低
- 数据库压力大
性能对比
| 方案 | 性能 | 可靠性 | 复杂度 |
|---|---|---|---|
| Redis | 高 | 中 | 中 |
| Zookeeper | 中 | 高 | 高 |
| 数据库 | 低 | 高 | 低 |
常见面试题
Redis分布式锁的问题?
- 锁过期时间
- 锁误释放
- 主从切换
如何选择分布式锁?
- 高性能场景:Redis
- 高可靠场景:Zookeeper
- 简单场景:数据库
分布式锁的死锁问题?
- 设置过期时间
- 使用看门狗续期
- 及时释放锁