> 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指令融合到一起。