1. 程式人生 > >redis實現分布式鎖

redis實現分布式鎖

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實現分布式鎖