亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

如何在Redis實現分布式鎖

2020-02-17 14:56:09
字體:
來源:轉載
供稿:網友

背景:

在很多互聯網產品應用中,有些場景需要加鎖處理,比如:秒殺,全局遞增ID,樓層生成等等。大部分是解決方案基于DB實現的,Redis為單進程單線程模式,采用隊列模式將并發訪問變成串行訪問,且多客戶端對Redis的連接并不存在競爭關系。

?

項目實踐

任務隊列用到分布式鎖的情況比較多,在將業務邏輯中可以異步處理的操作放入隊列,在其他線程中處理后出隊,此時隊列中使用了分布式鎖,保證入隊和出隊的一致性。關于redis隊列這塊的邏輯分析,我將在下一次對其進行總結,此處先略過。


接下來對redis實現的分布式鎖的邏輯代碼進行詳細的分析和理解:

1、為避免特殊原因導致鎖無法釋放, 在加鎖成功后, 鎖會被賦予一個生存時間(通過 lock 方法的參數設置或者使用默認值), 超出生存時間鎖將被自動釋放.

2、鎖的生存時間默認比較短(秒級, 具體見 lock 方法), 因此若需要長時間加鎖, 可以通過 expire 方法延長鎖的生存時間為適當的時間. 比如在循環內調用 expire
3、系統級的鎖當進程無論因為任何原因出現crash,操作系統會自己回收鎖,所以不會出現資源丟失。
4、但分布式鎖不同。若一次性設置很長的時間,一旦由于各種原因進程 crash 或其他異常導致 unlock 未被調用,則該鎖在剩下的時間就變成了垃圾鎖,導致其他進程或進程重啟后無法進入加鎖區域。

?

redis = RedisFactory::instance()->getString();  }   /**   * 加鎖  *  * @param string 鎖的標識名  * @param int 獲取鎖失敗時的等待超時時間(秒), 在此時間之內會一直嘗試獲取鎖直到超時. 為 0 表示失敗后直接返回不等待  * @param int 當前鎖的最大生存時間(秒), 必須大于 0 . 如果超過生存時間后鎖仍未被釋放, 則系統會自動將其強制釋放  * @param int 獲取鎖失敗后掛起再試的時間間隔(微秒)  */  public function lock($name, $timeout = 0, $expire = 15, $waitIntervalUs = 100000) {    if(empty($name)) return false;     $timeout = (int)$timeout;    $expire = max((int)$expire, 5);    $now = microtime(true);    $timeoutAt = $now + $timeout;    $expireAt = $now + $expire;     $redisKey = "Lock:$name";    while(true) {      $result = $this->redis->setnx($redisKey, (string)$expireAt);      if($result !== false) {        //對$redisKey設置生存時間        $this->redis->expire($redisKey, $expire);        //將最大生存時刻記錄在一個數組里面        $this->lockedNames[$name] = $expireAt;        return true;      }       //以秒為單位,返回$redisKey 的剩余生存時間      $ttl = $this->redis->ttl($redisKey);      // TTL 小于 0 表示 key 上沒有設置生存時間(key 不會不存在, 因為前面 setnx 會自動創建)      // 如果出現這種情況, 那就是進程在某個實例 setnx 成功后 crash 導致緊跟著的 expire 沒有被調用. 這時可以直接設置 expire 并把鎖納為己用      if($ttl redis->set($redisKey, (string)$expireAt, $expire);        $this->lockedNames[$name] = $expireAt;        return true;      }       // 設置了不等待或者已超時      if($timeout  $timeoutAt) break;       // 掛起一段時間再試      usleep($waitIntervalUs);    }     return false;  }   /**  * 給當前鎖增加指定的生存時間(秒), 必須大于 0  *  * @param string 鎖的標識名  * @param int 生存時間(秒), 必須大于 0  */  public function expire($name, $expire) {    if($this->isLocking($name)) {      if($this->redis->expire("Lock:$name", max($expire, 1))) {        return true;      }    }    return false;  }   /**  * 判斷當前是否擁有指定名稱的鎖  *  * @param mixed $name  */  public function isLocking($name) {    if(isset($this->lockedNames[$name])) {      return (string)$this->lockedNames[$name] == (string)$this->redis->get("Lock:$name");    }    return false;  }   /**  * 釋放鎖  *  * @param string 鎖的標識名  */  public function unlock($name) {    if($this->isLocking($name)) {      if($this->redis->deleteKey("Lock:$name")) {        unset($this->lockedNames[$name]);        return true;      }    }    return false;  }   /** 釋放當前已經獲取到的所有鎖 */  public function unlockAll() {    $allSuccess = true;    foreach($this->lockedNames as $name => $item) {      if(false === $this->unlock($name)) {        $allSuccess = false;      }    }    return $allSuccess;  }}

此類很多代碼都寫上了注釋,只要認真理解下,就很容易懂得如何在redis實現分布式鎖了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲欧洲高清一区| 一区二区三区在线播放欧美| 欧美日韩加勒比精品一区| 91久久国产精品| 日韩免费av一区二区| 亚洲在线视频福利| 91久久在线观看| 日韩av在线看| 欧美最猛黑人xxxx黑人猛叫黄| 久久久久久久久久久久av| 亚洲第一国产精品| 亚洲视频在线免费看| 在线亚洲欧美视频| 国产91对白在线播放| 亚洲精品日韩激情在线电影| 色yeye香蕉凹凸一区二区av| 色无极影院亚洲| 国产成人精品在线播放| 欧美精品18videos性欧美| 亚洲国产精品999| 成人免费高清完整版在线观看| 日韩av在线导航| 中文字幕亚洲一区| 一区二区欧美日韩视频| 精品久久久久久久久久| 中文字幕少妇一区二区三区| 日韩美女免费观看| 永久免费毛片在线播放不卡| 国产精欧美一区二区三区| 国产精品美女www| 国产欧美一区二区三区在线看| 日韩在线观看网站| 国产91亚洲精品| 91综合免费在线| 欧美精品在线第一页| 粗暴蹂躏中文一区二区三区| 日韩欧美在线字幕| 欧美大肥婆大肥bbbbb| 欧美自拍视频在线| 国产成人午夜视频网址| 在线播放国产精品| 亚洲精品成人久久电影| 精品日本高清在线播放| 91久久久久久久一区二区| 韩国福利视频一区| 久久天堂av综合合色| 亚洲色图激情小说| 国产一区二区三区在线| 亚洲精品久久久一区二区三区| 日本一本a高清免费不卡| 国产ts人妖一区二区三区| 成人激情在线播放| 粉嫩老牛aⅴ一区二区三区| 91久久精品国产91久久性色| www.欧美精品一二三区| 国产精品999| 久久激情五月丁香伊人| 国产精品久久久久久久久久久久久久| 97精品国产97久久久久久| 日韩资源在线观看| 美女撒尿一区二区三区| 国产精品美乳在线观看| 国产成一区二区| 日本精品免费一区二区三区| 欧美精品情趣视频| 日韩av免费看| 亚洲欧美成人网| 欧美日韩国产在线| 色噜噜狠狠狠综合曰曰曰88av| 亚洲成在人线av| 欧美夫妻性生活视频| 亚洲免费av网址| 丝袜美腿精品国产二区| 日韩精品视频在线观看网址| 欧美最顶级丰满的aⅴ艳星| 国产日产亚洲精品| 黑人精品xxx一区一二区| 亚洲精品在线不卡| 精品丝袜一区二区三区| 亚洲欧美日韩精品| 九九精品在线播放| 欧美日韩视频在线| 91久久久久久| 欧美成人免费在线观看| 欧美韩国理论所午夜片917电影| 国产精品久久久久久av福利软件| 欧美成人黑人xx视频免费观看| 亚洲人高潮女人毛茸茸| 久久成人国产精品| 亚洲影院色在线观看免费| 国产精品久久久久秋霞鲁丝| 国产精品女主播视频| 成人国产精品色哟哟| 中文字幕亚洲第一| 国产在线精品一区免费香蕉| 久久青草精品视频免费观看| 亚洲欧洲第一视频| 欧美午夜片在线免费观看| 日韩中文视频免费在线观看| 欧美不卡视频一区发布| 亚洲影视九九影院在线观看| 日韩高清欧美高清| 久久久免费观看| 欧美黑人狂野猛交老妇| 欧美激情网友自拍| 国产精品高清免费在线观看| 国产一区二区三区视频在线观看| 亚洲精品久久久久久下一站| 欧美高清视频在线观看| 亚洲欧美国产日韩中文字幕| 亚洲最大中文字幕| 亚洲在线免费观看| 亚洲福利在线播放| 亚洲精品日韩激情在线电影| 日韩精品极品视频| 欧美在线视频一区| 精品国产91久久久| 2019精品视频| 高清一区二区三区日本久| 68精品国产免费久久久久久婷婷| 欧美性生交xxxxx久久久| 亚洲美女精品久久| 日韩av网站在线| 国产精品视频最多的网站| 亚洲人成毛片在线播放| 精品视频一区在线视频| 国产精品国内视频| 久久99久久久久久久噜噜| zzijzzij亚洲日本成熟少妇| 欧美一区二区三区免费视| 日韩在线www| 欧美韩日一区二区| 热久久免费视频精品| 中日韩午夜理伦电影免费| 欧美日韩亚洲网| 亚洲国产成人精品久久| 中文字幕亚洲一区二区三区五十路| 欧美黑人性视频| 少妇久久久久久| 国产午夜精品麻豆| 最近日韩中文字幕中文| 亚洲第一中文字幕| 日韩美女写真福利在线观看| 欧美大成色www永久网站婷| 亚洲国产精品久久久久秋霞蜜臀| 国产亚洲精品久久久| 国产成人久久精品| 亚洲xxxxx性| 国产亚洲综合久久| 91精品久久久久久久久久久久久久| 国产精品久久久久久久久借妻| 欧美性猛交视频| 亚洲福利视频专区| 亚洲精品国产电影| 亚洲欧洲第一视频| 亚洲人成绝费网站色www| 久久亚洲国产精品成人av秋霞| 欧美人在线视频| 日韩在线不卡视频| 亚洲成人黄色网址| 精品视频—区二区三区免费| 精品久久久香蕉免费精品视频| 亚洲免费影视第一页| 国产日本欧美一区二区三区在线|