1. 程式人生 > 其它 >分散式鎖之Redis分散式鎖

分散式鎖之Redis分散式鎖

分散式鎖的實現方式:Redis分散式鎖

首先需要了解下基本的原理: 多個redis客戶端執行setnx指令,設定一個相同的key,誰能夠建立key成功,誰就能夠獲取鎖,當key建立成功後,會返回true,說明加鎖成功,其他客戶端請求就無法獲取鎖,就會直接返回false,搶鎖失敗,這樣確保只有一個客戶端請求執行。

具體命令如下:

 SETNX key value

將 key 的值設為 value ,當且僅當 key 不存在。
若給定的 key 已經存在,則 SETNX 不做任何動作。
SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。
返回值:
設定成功,返回 1 。
設定失敗,返回 0 。

既然設定了value值,那麼我們肯定會想到過期時間,那麼就需要再使用setnx指令後繼續使用expire指令。但是這兩個操作必定不是原子性的,如果執行expire失敗或者執行完setnx指令後redis伺服器宕機,那麼這就會導致這個key一直存在於redis,產生死鎖。

在Redis2.8 之後,官方執行setnx 和 expire命令一起使用了。如下:

SET lock_key lock_value NX PX 30000
  1. lock_key:即鎖名稱,這個名稱應是公開的,在分散式環境中,對於某一確定的公共資源,所有爭用方(客戶端)都應該知道對應鎖的名字。對於 Redis 而言,lock_name 就是 key-value 中的 key,具有唯一性。
  2. lock_value:是由客戶端生成的一個隨機字串,它要保證在足夠長的一段時間內在所有客戶端的所有獲取鎖的請求中都是唯一的,用於唯一標識鎖的持有者。
  3. NX 表示只有當 lock_key(key) 不存在的時候才能 SET 成功,從而保證只有一個客戶端能獲得鎖,而其它客戶端在鎖被釋放之前都無法獲得鎖。
  4. PX 30000 表示這個鎖節點有一個 30 秒的自動過期時間(目的是為了防止持有鎖的客戶端故障後,無法主動釋放鎖而導致死鎖,因此要求鎖的持有者必須在過期時間之內執行完相關操作並釋放鎖)。