Skip to content

如何用redis的setnx命令实现一个可重入锁 ​

题目 ​

如何基于 Redis 实现可重入锁?

参考答案 ​

严格说只靠 setnx 不够,还需要保存:

  • 锁持有者标识
  • 重入次数
  • 过期时间和续期机制

工程实践里一般直接用 Redisson,不会从零自己实现可重入锁。

回答展开 ​

  • 可重入锁的核心是同一个线程第二次进入临界区时,不会被自己阻塞,所以实现上至少要保存持有者身份和重入次数。
  • 如果只做一个简单的 setnx,只能实现最基础的互斥,做不到真正的可重入,还缺少续期、超时、原子解锁这些工程能力。
  • 这题回答时最好顺带提一句:真实项目里通常不会自己从零实现,而是直接用 Redisson 这类成熟方案。

实际场景 ​

比如订单提交流程外层已经加了一把分布式锁,内部又调用了一个也需要同一业务锁的库存校验方法。如果锁不支持可重入,就会出现自己把自己锁死的问题。

努力工作 享受生活