天天看點

Redis 分布式鎖避免死鎖的使用方式一、什麼是分布式鎖二、分布式鎖需要解決的問題三、實作原理

一、什麼是分布式鎖

要介紹分布式鎖,首先要提到與分布式鎖相對應的是線程鎖、程序鎖。

線程鎖:主要用來給方法、代碼塊加鎖。當某個方法或代碼使用鎖,在同一時刻僅有一個線程執行該方法或該代碼段。線程鎖隻在同一JVM中有效果,因為線程鎖的實作在根本上是依靠線程之間共享記憶體實作的,比如synchronized是共享對象頭,顯示鎖Lock是共享某個變量(state)。

程序鎖:為了控制同一作業系統中多個程序通路某個共享資源,因為程序具有獨立性,各個程序無法通路其他程序的資源,是以無法通過synchronized等線程鎖實作程序鎖。

分布式鎖:當多個程序不在同一個系統中,用分布式鎖控制多個程序對資源的通路。

二、分布式鎖需要解決的問題

    1.互斥性:任一時刻是有一個用戶端擷取鎖,不能兩個用戶端擷取到鎖

    2.安全性:鎖隻能被持有該用戶端的删除,不能由其他用戶端删除

    3.死鎖:一個用戶端擷取到鎖,導緻當機,而其他用戶端無法擷取到資源

    4.容錯:一些節點當機,用戶端任然能擷取鎖和釋放鎖

三、實作原理

    redis指令:SETNX key value:如果key不存在,則建立并指派

    指令傳回:設定成功,傳回1,設定失敗 傳回0

     redis 過期指令: EXPIRE key seconds, 設定key 的生存時間,當key過期(生存時間為0),會自動删除

     存在風險:SETNX和EXPIRE 為兩個指令,如果設定了SETNX後程式崩潰,EXPIRE未成功執行則會出現資源鎖死的情況。

針對該問題,redis 在2.6.12版本過後增加新的解決方案

    SET key value [EX seconds] [PX millisecounds] [NX|XX]

  • EX seconds:設定鍵的過期時間為second秒
  • PX millisecounds:設定鍵的過期時間為millisecounds 毫秒
  • NX:隻在鍵不存在的時候,才對鍵進行設定操作
  • XX:隻在鍵已經存在的時候,才對鍵進行設定操作
  • SET操作成功後,傳回的是OK,失敗傳回NIL

繼續閱讀