如何用redis的setnx命令实现一个可重入锁
题目
如何基于 Redis 实现可重入锁?
参考答案
严格说只靠 setnx 不够,还需要保存:
- 锁持有者标识
- 重入次数
- 过期时间和续期机制
工程实践里一般直接用 Redisson,不会从零自己实现可重入锁。
回答展开
- 可重入锁的核心是同一个线程第二次进入临界区时,不会被自己阻塞,所以实现上至少要保存持有者身份和重入次数。
- 如果只做一个简单的 setnx,只能实现最基础的互斥,做不到真正的可重入,还缺少续期、超时、原子解锁这些工程能力。
- 这题回答时最好顺带提一句:真实项目里通常不会自己从零实现,而是直接用 Redisson 这类成熟方案。
实际场景
比如订单提交流程外层已经加了一把分布式锁,内部又调用了一个也需要同一业务锁的库存校验方法。如果锁不支持可重入,就会出现自己把自己锁死的问题。