分布式锁有哪些实现方式?
后端开发第 10 / 13 题答题框架
参考思路:DB 唯一索引→Redis(SET NX+过期+续期)→Redisson 看门狗→ZooKeeper/etcd(一致性优先)→对比可靠性与性能。锁的三个问题(过期/误删/不可重入)要覆盖。
五个经典回答示范
回答一 · 校招应届版
分布式锁解决多实例并发修改共享资源的问题。实现从简单到可靠:DB 唯一索引最简单但性能差;Redis 的 SET key value NX EX 最常用,value 放唯一标识防止误删别人的锁,释放用 Lua 判断再删;要求可靠性用 ZooKeeper 或 etcd,基于临时节点,会话断开自动释放。
回答二 · 1-3年经验版
我讲一个真实坑:Redis 锁过期了业务还没执行完,第二个实例拿到锁并发进入。解法是看门狗——后台线程定期续期,业务完成再释放;同时释放时校验 value 避免删掉别人的锁。我们后来直接用 Redisson 封装好的实现,但面试里我能讲清它源码里续期和可重入是怎么做的。
回答三 · 资深版
我会先反问业务要不要锁:很多场景用幂等或队列串行化更优雅。要锁则按需求分层:效率型锁——避免重复计算,Redis 足够,偶尔失效可接受;正确性型锁——钱和库存,必须考虑 Redis 主从切换丢锁的问题,要么红锁要么 etcd/ZK 类共识系统。锁的粒度与持有时间同样关键:锁内不做慢 IO。
回答四 · 追问应对
追问『为什么要 value 唯一标识』:防止 A 的锁过期后 B 持锁,A 执行完把 B 的锁删了;『Redis 主从切换锁丢了』:异步复制导致新主没有锁数据,红锁用多数派写入缓解,但有争议,正确性优先用 ZK;『锁等待怎么做』:自旋加退避或订阅释放消息,避免大量空转。
回答五 · 反面示范
『用 Redis 的 setnx 加锁,del 解锁,就这么简单,过期时间随便设个十秒,够用了。』——点评:没 value 校验会误删锁;过期时间拍脑袋——业务超过十秒就是并发事故,短了又容易锁失效。分布式锁的难点恰恰在边界,答得太轻松反而露怯。
怎么练这道题
- 打开 模拟练习,选择「后端开发」方向,限时 3 分钟作答本题。
- 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
- 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。
这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。