> setnx lock:XXXX true ... 业务处理 ... > del lock:XXXX (integer) 1 |
这里有个问题,就是当“业务处理”发生死循环时,释放锁的操作就永远不会发生,为了避免这种情况发生,进行如下改进:
> setnx lock:XXXX true > expire lock:XXXX 5 ... 业务处理 ... > del lock:XXXX (integer) 1 |
这里通过expire添加时间限制,这样,无论“业务处理”发生什么,都能确保释放锁。
这里,setnx与expire是两个独立的指令,这就导致了setnx与expire之间可能发生异常,还是会导致无法释放锁,于是Redis2.8的时候,通过在set添加扩展参数的方式,把setnx、expire指令融合到一起。