前言
Redis分布式锁的实现相对来说简单、高效,在并发量很高,且不追求锁的强一致性的一些实际业务场景中,被广发的使用。
在使用过程中,redis分布式锁往往也伴随着很多坑,今天我们围绕着非原子操作、锁超时问题展开来聊一聊,给需要的同学一些参考。
使用Redis分布式锁,我们首先想到的可能是setNx命令
kotlin
复制代码
if (this.setNX(lockKey, val) == 1) { //TODO }
加锁操作很简单。加锁之后我们面临的问题就是锁释放,或者说解锁。
这里的解锁操作,有如下两个方案,也都存在各自的问题:
如图: 1.通过del进行锁释放时,是存在死锁问题的,这个时候我的方案是,在锁是否超时的判断上采用超时时间作为value的方案,这样能够避免死锁
2.设置锁超时:
kotlin
复制代码
if (this.setNX(lockKey, val) == 1) { this.expire(lockkey,timeout); }
从上述代码可以看到,非原子操作是会带来死锁问题的。