Skip to the content.

首页

分布式锁

分布式锁的意义在于提供一个高可用的分布式场景下的互斥机制,任何方案都不是绝对可靠的,分布式系统的NPC问题(网络延迟、进程暂停、时钟漂移)均可能导致执行过程中锁意外释放,故需要额外的兜底措施(如乐观锁)以保证正确性。


需要满足的条件


实现方式


数据库

唯一索引实现

创建一张带有唯一索引的表,插入数据成功表示获取到锁,释放锁则删除数据。

数据库行锁实现

开启事务,对某条数据加锁,加锁成功表示获取到锁,提交事务则释放锁。


redis

普通实现

使用SETNX命令设置一个键,并设置过期时间,释放锁时需要先判断锁是否失效再删除键(使用lua脚本)。

redlock

多实例架构下的解决方案,要求至少五个主节点(互相完全独立且无从节点),在超过半数的实例上获取锁成功且总耗时小于锁过期时间才视为获取锁成功,不推荐使用,因为流程太过繁重,且同样无法解决NPC问题(Network Delay & Process Pause & Clock Drift)。


zookeeper

通过临时顺序节点实现,如果创建的子节点序号最小则表示获取锁成功,释放锁则删除节点。