如何用redis的setnx命令实现一个公平锁
题目
如何基于 Redis 实现公平锁?
参考答案
公平锁的核心是排队顺序,单靠 setnx 只能做到互斥,做不到天然公平。
如果真要实现,通常还要:
- 维护等待队列
- 按顺序唤醒
- 处理超时和掉线
所以工程上一般也会用成熟组件,而不是自己造轮子。
回答展开
- 公平锁的关键不是谁先抢到谁执行,而是要保证等待顺序,所以实现上往往需要排队队列和顺序唤醒机制。
- 单靠 setnx 很难做到严格公平,因为它天生更像抢占式互斥,而不是有序排队。
- 回答时可以补一句:公平锁通常吞吐会比非公平锁低,所以只有在确实有顺序要求时才值得使用。
实际场景
比如排队抢购、顺序审批这类业务,如果后来的请求不断插队,前面的请求就可能长期拿不到锁,这时才会考虑用更公平的锁模型。