<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          1小時掌握Redisson實現(xiàn)Redis分布式鎖以及Redlock分布式鎖

          共 1963字,需瀏覽 4分鐘

           ·

          2021-09-26 19:21

          利用中秋節(jié)時間補一下redis分布式鎖的知識,在B站上看到程序員諸葛老師講的《Redisson實現(xiàn)Redis分布式鎖以及Redlock分布式鎖》課程感覺不錯。

          超賣問題,應(yīng)該是97 但是三個線程執(zhí)行完之后依舊是99

          問題:公司一般兩臺機器或者多臺機器,多點

          模擬場景

          Jmeter使用  springBoot啟動兩個機器,改一下端口

          并發(fā)量越高,出現(xiàn)“超賣”的機率越大。在分布式環(huán)境下,產(chǎn)生的鎖是鎖不住的,不同的請求發(fā)到nginx上,幫忙做負載均衡,如果兩個請求均勻地分發(fā)到不同的Tomcat去,生出來的鎖只在JVM進程內(nèi)有效, 在同一個Tomcat內(nèi)有效,沒辦法跨tomcat控制的。

          入門級分布式鎖的實現(xiàn)

          注:redis單線程

          拋異常導(dǎo)致請求死鎖

          宕機

          宕機,redis鎖還存在,其他機器請求時候

          原子執(zhí)行,不可分割,

          請求執(zhí)行時間很長,

          • 假設(shè)請求時間比較長,執(zhí)行15s,假設(shè)請求質(zhì)控relStock時,過去了10s,這把鎖被redis 清理掉了,

          意味這什么呢?高并發(fā)場景,外面不斷有請求過來訪問接口

          • 第2個請求就可以加鎖成功,因為第一個請求的鎖被redis清除掉了,假設(shè)新來的請求執(zhí)行時間為8s

          • 第1個請求此時執(zhí)行了10s,再執(zhí)行5s,刪除之前的key,會刪除第二個線程的key,刪鎖操作

          • 超高并發(fā)過程中,之前加的鎖可能永久失效,只要高并發(fā)存在,鎖會永久失效,問題會被放大,秒殺場景,商家會虧死

          問題本質(zhì)

          自己加的鎖,被其他線程刪除

          開源框架解決

          redis源碼分析

          /**
          * 獲取分布式鎖
          *
          * @param lockKey 鎖定
          * @param waitTime 鎖定等待時間
          * @param leaseTime 獲取到的鎖的存活時間,到期后自動釋放
          * @return 未能鎖定則返回null
          */
          @Override
          public RLock tryLock(String lockKey, long waitTime, long leaseTime) {
          RLock lock = redisson.getLock(lockKey);
          try {
          if (lock.tryLock(waitTime, leaseTime, TimeUnit.MILLISECONDS)) {
          return lock;
          }
          } catch (InterruptedException ignore) {
          if (log.isWarnEnabled()) {
          log.warn("Redisson tryLock exception", ignore);
          }
          }
          return null;
          }
          復(fù)制代碼

          public RLock getLock(String name) {
          return new RedissonLock(this.connectionManager.getCommandExecutor(), name);
          }
          復(fù)制代碼

          lua具有原子性,當(dāng)做一條命令執(zhí)行

          從cap角度剖析redis&zookeeper鎖架構(gòu)

          redis很少單機版,至少主從 哨兵 集群 如果redis是多節(jié)點情況下,會不會出現(xiàn)什么問題?若redis是主從、哨兵模式還是會有問題的。

          加鎖之后,redis底層設(shè)置key,redis默認情況下是異步同步,主節(jié)點寫之后,異步同步從節(jié)點,主要如果主節(jié)點key寫成功之后,馬上返回客戶端,鎖加成功了,redis主節(jié)點開始同步從節(jié)點,假設(shè)剛開始同步從節(jié)點,主節(jié)點掛掉了怎么辦?

          CAP原則:redis集群滿足AP架構(gòu)

          zk滿足CP架構(gòu)(ZAB協(xié)議):加鎖向主節(jié)點寫,不會立刻向客戶端返回加鎖成功的結(jié)果,而是先向從節(jié)點同步,同步成功之后,才告訴客戶端加鎖成功了,有延遲,犧牲了一點可用性,達到一致性。即使集群掛掉,對外也是不可用,也要達到數(shù)據(jù)一致性。

          萬一主節(jié)點掛掉,從從節(jié)點選舉出新的主節(jié)點

          對并發(fā)要求比較高,建議選擇redis,即使出現(xiàn)redis主從架構(gòu)失效問題,出現(xiàn)概率不大,可以人工補償措施,寫腳本補償。

          Redlock 不推薦使用,使用zk

          需要很多機器加鎖成功,才能算成功,性能會受影響,也存在鎖回滾情況。


          作者:程序員說書
          鏈接:https://juejin.cn/post/7009958172265824293
          來源:掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91福利站| 成人黄色在线观看视频 | 日韩黄色一级电影 | 日本美女操逼免费看 | 婷婷在线伊人 |