redis中的分佈式鎖
在高併發的場景下,redis中的數據會出現超賣的現象
分佈式鎖運用在:分佈式的場景下
秒殺
一個項目在一個tomcat下,只用synchronized就可解決,
如果在多個tomcat下,用synchronized 是無法解決超賣的問題
當多個請求來,可能會被nginx 分發到不同的tomcat上執行,
在JVM進程中執行synchronized代碼塊,同時對一個庫存操作出現問題
採用redis的分佈式鎖 在一個集羣中
壓力測試工具:Jmeter 性能問題 高併發場景下
redis單線程會對情求有個先後的順序
redis解決 分佈式的問題:
setnx命令: 通過setnx(key,value)加鎖後,需解鎖
key不存在:返回ture,表示獲取鎖成功
key存在: flase ,失敗
*****如果有中間的代碼出現異常,導致沒有釋放鎖,死鎖,其他線程無法獲得鎖
try{} finally{釋放鎖}
*****在獲取鎖後,執行中間的代碼,服務器宕機,導致不能釋放鎖
在setnx() 時 ,設置過期時間,在指定的時間後過期
將setnx() 和 expire()合併設置時間過期
******在設置過期時間後會帶來相應的問題
線程一:執行的時間>過期時間 導致設置的鎖失效,其他線程有獲取到鎖,
執行邏輯,存在其他線程執行時間過長,會導致線程間相互釋放對方加的鎖
導致鎖失效,和之前沒加鎖一樣。
把setnx中設置key 爲唯一,在釋放鎖時進行判斷,是否是之前的鎖
****** 設置時間過期後,setnx 中的key被替換
在獲取鎖後,開啓一個分線程,Timer類來監控是否已執行完,timer爲過期時間的1/3, 未執行完,重設過期時間
redisson 是java實現的工具來實現 加鎖 和設置時間 在finally 中釋放鎖解決以上問題
在主從中
****** 在主的redis中設置鎖後,處理業務的同時,要把鎖同步給從,但主的掛了,選舉一個從的爲主節點 ,存在高併發的場景下,線程來獲取主的鎖,但這個時候沒有鎖,怎麼解決
也造成鎖失效:redis中的紅鎖, 鎖失效,性能好
zookeeper集羣架構,實現分佈式鎖(主節點,從節點)分佈式選舉算法,
保證數據的一致性 zookeeper分佈式鎖
*******redis鎖在併發場景下不高,性能提高10倍?
把redis中的庫存,做一個分段的處理,高併發下分段減,分成10段 currenthashmap