1. 程式人生 > >Redis之分散式鎖的原理

Redis之分散式鎖的原理

一、使用分散式鎖要滿足的幾個條件:

  1. 系統是一個分散式系統(關鍵是分散式,單機的可以使用ReentrantLock或者synchronized程式碼塊來實現,即單程序多個執行緒訪問的話)
  2. 共享資源(各個系統訪問同一個資源,資源的載體可能是傳統關係型資料庫或者NoSQL)
  3. 同步訪問(即有很多個程序同時訪問同一個共享資源沒有同步訪問,誰管你資源競爭不競爭)

二、應用的場景例子  

         使用場景之一:

         

tomcat叢集環境下,有任務排程,也就是定時任務。同一時間多個tomcat執行同一個任務,如定時關單. 如果有大量訂單需要關閉,則每個tomcat都會執行相同數量的關單sql, 這樣是非常浪費資源的,如果還有相應的記錄的話 則會導致重複記錄的出現. 
這個時候redis分散式鎖就派上用場了,通過這個鎖,可以隨機的讓單個tomcat去執行關單操作,而其餘的tomcat則不會執行關單操作。

         使用場景二 :

         管理後臺的部署架構

多臺tomcat伺服器+redis【多臺tomcat伺服器訪問一臺redis】+mysql【多臺tomcat伺服器訪問一臺伺服器上的mysql】)就滿足使用分散式鎖的條件。多臺伺服器要訪問redis全域性快取的資源,如果不使用分散式鎖就會出現問題。 看如下虛擬碼:

long N=0L;
//N從redis獲取值
if(N<5){
N++;
//N寫回redis
}

上面的程式碼主要實現的功能:

  從redis獲取值N,對數值N進行邊界檢查,自加1,然後N寫回redis中。 這種應用場景很常見,像秒殺,全域性遞增ID、IP訪問限制等。以IP訪問限制來說,惡意攻擊者可能發起無限次訪問,併發量比較大,分散式環境下對N的邊界檢查就不可靠,因為從redis讀的N可能已經是髒資料。傳統的加鎖的做法(如java的synchronized和Lock)也沒用,因為這是分散式環境

,這個同步問題的救火隊員也束手無策。在這危急存亡之秋,分散式鎖終於有用武之地了。

  分散式鎖可以基於很多種方式實現,比如zookeeper、redis...。不管哪種方式,他的基本原理是不變的:用一個狀態值表示鎖,對鎖的佔用和釋放通過狀態值來標識。

   這裡主要講如何用redis實現分散式鎖。

      

轉載於:https://blog.csdn.net/qq_33666373/article/details/78870294 
                http://www.cnblogs.com/0201zcr/p/5942748.html