好问题。

  1. 我特别理解楼主的想法,想像使用sync.Mutex一样使用redis锁,取锁取不到的时候就自动阻塞本地goroutine。
  2. 大家耳熟能详的基于redis的setnx, setex方案,是不具备阻塞线程的能力的,因此也不能像sync.Mutex那样阻塞 goroutine
  3. redis是具备主动通知能力的,也就是publish/subscribe功能,如果楼主想要在redis锁超时或其它goroutine释放锁的时候通知阻塞的redis goroutine,可以使用publish/subscribe功能主动通知
  4. 我想信楼主是一个谨慎的人,一定想到这其中的原子性问题。先给楼主点赞,然后我想说的是:基于乐观锁的实现在一定程度上可以解决这类问题。
  5. 然后,可能更值得关注的点是,分布锁在理论上就是具备缺陷的,它需要一些类似于fencing token之类的技巧以解决分布式一致性问题,更详细的内容可以参考文章: