Redis分布式鎖實現(單機版)

基於單機redis的分佈式鎖:

我們看基於單個redis節點的分佈式鎖如何實現。相信很多人可以馬上按下面的思路寫好代碼:

  • setnx創建key,創建成功便獲得鎖。

  • 訪問共享資源,執行業務邏輯。

  • 操作完成,刪除key,釋放鎖。

正常情況下上面的邏輯能夠正常執行,但考慮如果客戶端A獲取鎖後掛掉了或由於網絡不可達,其他客戶端就再不能獲取鎖了。這時我們可以考慮對key設置一個過期時間,並設置一個唯一值來標識每個客戶端,可以使用下面命令來獲取鎖:

SET resource_name my_random_value NX PX 30000

Redis分佈式鎖實現(單機版)

注意這是一個原子操作,如果分開成 設置key—設置失效時間,兩步,如果設置key後客戶端掛掉,仍然可能造成死鎖。並且只有 value='my_random_value' 才能釋放鎖,否則可能導致一個客戶端釋放另一個客戶端的鎖。對於釋放鎖,可以使用redis lua腳本:

if redis.call("get",KEYS[1]) == ARGV[1] then

return redis.call("del",KEYS[1])

else

return 0

end

注意del key實際上是一個非原子操作,需要先拿到key、判斷、刪除。使用lua腳本可以將這個過程轉化為原子操作,否則進行到判斷 value='my_random_value' 要刪除後,由於gc或網絡等原因導致刪除命令延遲到達,會將其他客戶端的鎖釋放掉。

Redis分佈式鎖實現(單機版)

Redis 分佈式鎖的正確實現方式( Java 版 ):

http://www.importnew.com/27477.html?utm_source=tuicool&utm_medium=referral

結合上面的分析,我們總結下單機版redis分佈式鎖的需要考慮的點:

需要設置鎖的失效時間

需要對每個客戶端設置唯一的標識

需要保證獲取鎖、釋放鎖是原子操作


分享到:


相關文章: