🔒 什么是分布式锁?
分布式锁是在分布式系统中控制共享资源访问的机制 ,用于解决高并发场景下数据不一致 、操作冲突 等问题。核心目标是保证跨进程 / 跨节点 的互斥性,常见实现方案包括:数据库锁、Redis 锁、ZooKeeper 锁。
📌 分布式锁的核心特性
1. 互斥性(最核心特性)
同一时间仅允许一个线程 / 节点持有锁
🔹 实现示例:
- Redis:SET key value NX PX timeout
- ZooKeeper:创建临时顺序节点,监听前驱节点
2.阻塞 vs 非阻塞
类型 | 描述 | 实现 |
---|---|---|
阻塞锁 | 未获取锁时进入等待状态(如排队) | MySQL FOR UPDATE |
非阻塞锁 | 未获取锁时立即返回(可配合重试机制) | Redis、RedLock |
3.死锁预防
场景 :节点崩溃未释放锁、网络问题导致锁超时
解决方案 :
✅ 自动超时:Redis 设置 TTL(需平衡超时时间与业务执行时间)
✅ 租约机制:ZooKeeper 临时节点(节点宕机自动删除)
✅ 死锁检测:数据库通过innodb_lock_wait_timeout参数
4.性能考量
指标 | 数据库锁 | Redis锁 | Zookeeper |
---|---|---|---|
吞吐量 | 低 | 高 | 中 |
延迟 | 高 | 低 | 中 |
一致性 | 强一致 | 最终一致 | 顺序一致 |
5.成本维度
维度 | 数据库锁 | Redis锁 | Zookeeper |
---|---|---|---|
实现成本 | 低 | 中 | 高 |
维护成本 | 低 | 中 | 高 |
高可用 | 依赖数据库 | 集群部署 | 集群部署 |
🔧 典型实现方案对比
维度 | 数据库锁 | Redis锁 | Zookeeper |
---|---|---|---|
方案 | 优点 | 缺点 | 适用场景 |
数据库 | 实现简单、强一致性 | 性能瓶颈、易死锁 | 低并发、强一致场景 |
Redis | 高性能、轻量级 | 存在锁失效风险(主从同步延迟) | 高并发、最终一致场景 |
Zookeeper | 高可靠、支持阻塞锁 | 实现复杂、性能较低 | 分布式协调、高可靠场景 |
💡 最佳实践建议
- 优先选择 Redis:适用于大多数高并发场景(配合 RedLock 算法提升可靠性)
- 复杂场景用 ZooKeeper:需要阻塞锁或强一致性的场景(如分布式事务)
- 数据库锁兜底:作为简单场景的备选方案,避免过度设计
总结:分布式锁的设计需要在互斥性、性能、可靠性之间权衡,没有银弹方案,需根据业务场景选择最合适的实现。