redis中的分佈式鎖

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章