redis實現分布式鎖
阿新 • • 發佈:2018-02-08
mman blog protocol unix eply pic topic 算法 超時
SETNX key value
將key
設置值為value
,如果key
不存在,這種情況下等同SET命令。 當key
存在時,什麽也不做。SETNX
是”SET if Not eXists”的簡寫。
返回值
Integer reply, 特定值:
1
如果key被設置了0
如果key沒有被設置
##例子
redis> SETNX mykey "Hello" (integer) 1 redis> SETNX mykey "World" (integer) 0 redis> GET mykey "Hello" redis>
如果客戶端獲取鎖成功,那麽setnx返回1,否則返回0;
為防止出現死鎖,需要SETNX 時設置有效時間,已防止遲持有鎖的客戶端崩潰時,無法釋放鎖,形如:
SETNX lock.foo <current Unix time + lock timeout + 1>
為了使這種加鎖算法更加的健壯,持有鎖的客戶端應該總是要檢查是否超時,保證使用DEL
釋放鎖之前不會過期,因為客戶端故障的情況可能是復雜的,不止是崩潰,還會阻塞一段時間,阻止一些操作的執行,並且在阻塞恢復後嘗試執行DEL
(此時,該LOCK已經被其他客戶端所持有)
redis實現分布式鎖