Redis之分散式鎖的原理
阿新 • • 發佈:2018-11-03
一、使用分散式鎖要滿足的幾個條件:
- 系統是一個分散式系統(關鍵是分散式,單機的可以使用ReentrantLock或者synchronized程式碼塊來實現,即單程序多個執行緒訪問的話)
- 共享資源(各個系統訪問同一個資源,資源的載體可能是傳統關係型資料庫或者NoSQL)
- 同步訪問(即有很多個程序同時訪問同一個共享資源。沒有同步訪問,誰管你資源競爭不競爭)
二、應用的場景例子
使用場景之一:
這個時候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