






















架构设计原则:能不用分布式锁就不用。
但这句话不能停在“经验之谈”,必须理解背后的系统理论。
我给你一个架构级判断框架。
分布式锁本质是:
它解决的不是一致性问题,而是:
因为分布式锁有天然成本:
|
成本类型 |
说明 |
|
可用性降低 |
锁服务挂了,业务全阻塞 |
|
性能下降 |
所有请求串行化 |
|
死锁风险 |
续期失败或异常 |
|
复杂度 |
需要处理过期、误删、主从切换 |
|
CAP影响 |
Redis锁不保证强一致 |
你加锁,本质是:
架构设计第一原则是:
只有在以下三种场景之一成立时。
例如:
例如:
扣库存发送短信调用外部支付接口
你无法用一个本地事务包住。
必须通过“互斥”避免重复执行。
典型场景:
例如:
10个服务实例
只允许1个执行定时任务
这时分布式锁是合理的。
例如:
数据库无法约束时。
这是架构师必须掌握的。
例如:
防止重复订单
UNIQUE(userId, productId)
强一致
无锁
高可靠
优于Redis锁。
例如库存扣减:
update stockset count = count - 1where id = 1 and count > 0
这是CAS模式。
比加锁高效。
核心思想:
比如:
update Expenseset Status = 'Processing'where BusinessId = @idand Status = 'Init'
影响行数:
这就天然实现了:
而且没有真正“锁住”任何东西。
前端给唯一id 后端数据库表增加唯一约束 通过数据库来解决
这是金融系统标准方案。
秒杀系统如果加分布式锁:
直接废掉吞吐。
应该使用:
当你遇到并发问题时:
如果能,用数据库。
如果能,用幂等。
如果必须:
再考虑分布式锁。
分布式锁不是一致性工具。
真正的一致性靠:
分布式锁只是:
这点非常重要。
你当前:
结论:
你根本不需要 Redis 分布式锁。
数据库已经是最强锁。
我会用在:
而不会用在:
如果面试官问:
你可以回答:
只有在跨实例、跨资源、无法通过事务解决的互斥场景下才会使用。
并且根据一致性要求选择 Redis 或 ZooKeeper。
这就是架构思维。
如果你的系统还能用数据库事务解决问题,就不要引入分布式锁。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。