分布式锁完全教程:从数据库到Redis再到ZooKeeper,把并发下的那把锁一次用对

开篇:单机锁失效的那一刻

很多程序员第一次意识到"锁"这件事有问题,往往是在一个很具体的场景下。

比如一个秒杀接口,库存只剩 1 件,同时来了 20 个请求。代码里明明写了 if (stock > 0) { stock--; 下单(); },本地测试跑一百遍都是对的,一上线就超卖了 3 件。

再比如一个定时任务,部署在两个实例上,本意是"谁先抢到谁执行",结果两个实例同时跑了一遍,账平白无故多出一倍。

再比如一个幂等写入,用户手抖连点了两次,两个请求同时进来查"有没有这条记录",都查到"没有",然后都插了一条。

这三个问题的根子是一样的:本地的 synchronized 或 ReentrantLock,只能管住一台 JVM 里的线程。 一旦你的服务部署在多台机器上,或者同一个进程里有多个 worker 在跑,这些锁就只是"本地规矩",别的进程根本看不见。

分布式锁要解决的,就是这件事:在多个互相看不见的进程之间,建立一个所有人都能看见、并且大家都认的排队规则。

这篇文章会把这件事从头讲清楚。不讲玄学,不堆概念,沿着"你到底需要什么 → 有哪几种做法 → 每种做法的坑在哪 → 怎么选 →

内容摘要

一句话概述:很多程序员第一次意识到"锁"这件事有问题,往往是在一个很具体的场景下。

你将了解到:

  • 单机锁失效的那一刻
  • 先想清楚你要锁的到底是什么
  • 用数据库做锁
  • Redis 分布式锁(事实上的主流)
  • Redlock
  • ZooKeeper / etcd 锁

适合人群:需要动手落地、想补齐技术短板的开发者。

全文共 11 个章节,按「单机锁失效的那一刻 → ZooKeeper / etcd 锁」的顺序展开,每节都能单独查阅,配有可直接照做的清单与模板。

内容侧重可落地的操作流程与常见坑点,读完就能对照自己的情况动手,不需要额外补理论基础。

以上为全文要点速览,完整内容需解锁后阅读

🔒 付费文档

支付 5 积分后即可解锁全部内容