Skip to content

如何用redis的setnx命令实现一个公平锁 ​

题目 ​

如何基于 Redis 实现公平锁?

参考答案 ​

公平锁的核心是排队顺序,单靠 setnx 只能做到互斥,做不到天然公平。

如果真要实现,通常还要:

  • 维护等待队列
  • 按顺序唤醒
  • 处理超时和掉线

所以工程上一般也会用成熟组件,而不是自己造轮子。

回答展开 ​

  • 公平锁的关键不是谁先抢到谁执行,而是要保证等待顺序,所以实现上往往需要排队队列和顺序唤醒机制。
  • 单靠 setnx 很难做到严格公平,因为它天生更像抢占式互斥,而不是有序排队。
  • 回答时可以补一句:公平锁通常吞吐会比非公平锁低,所以只有在确实有顺序要求时才值得使用。

实际场景 ​

比如排队抢购、顺序审批这类业务,如果后来的请求不断插队,前面的请求就可能长期拿不到锁,这时才会考虑用更公平的锁模型。

努力工作 享受生活