婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis上實(shí)現(xiàn)分布式鎖以提高性能的方案研究

Redis上實(shí)現(xiàn)分布式鎖以提高性能的方案研究

熱門標(biāo)簽:地圖標(biāo)注如何即時生效 太原營銷外呼系統(tǒng) 最簡單的百度地圖標(biāo)注 玄武湖地圖標(biāo)注 竹間科技AI電銷機(jī)器人 小紅書怎么地圖標(biāo)注店 西藏教育智能外呼系統(tǒng)價格 地圖標(biāo)注費(fèi)用 百度商家地圖標(biāo)注怎么做

背景:

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

項(xiàng)目實(shí)踐

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


接下來對redis實(shí)現(xiàn)的分布式鎖的邏輯代碼進(jìn)行詳細(xì)的分析和理解:

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

2、鎖的生存時間默認(rèn)比較短(秒級, 具體見 lock 方法), 因此若需要長時間加鎖, 可以通過 expire 方法延長鎖的生存時間為適當(dāng)?shù)臅r間. 比如在循環(huán)內(nèi)調(diào)用 expire
3、系統(tǒng)級的鎖當(dāng)進(jìn)程無論因?yàn)槿魏卧虺霈F(xiàn)crash,操作系統(tǒng)會自己回收鎖,所以不會出現(xiàn)資源丟失。
4、但分布式鎖不同。若一次性設(shè)置很長的時間,一旦由于各種原因進(jìn)程 crash 或其他異常導(dǎo)致 unlock 未被調(diào)用,則該鎖在剩下的時間就變成了垃圾鎖,導(dǎo)致其他進(jìn)程或進(jìn)程重啟后無法進(jìn)入加鎖區(qū)域。

?php
 
require_once 'RedisFactory.php';
 
/**
* 在 Redis 上實(shí)現(xiàn)的分布式鎖
*/
class RedisLock {
  
//單例模式
  private static $_instance = null;
  public static function instance() {
    if(self::$_instance == null) {
      self::$_instance = new RedisLock();
    }
    return self::$_instance;
  }
 
  
//redis對象變量
  private $redis;
  
//存放被鎖的標(biāo)志名的數(shù)組
  private $lockedNames = array();
 
  public function __construct() {
    
//獲取一個 RedisString 實(shí)例
    $this->redis = RedisFactory::instance()->getString();
  }
 
  
/** 
  
* 加鎖
  
*
  
* @param string 鎖的標(biāo)識名
  
* @param int 獲取鎖失敗時的等待超時時間(秒), 在此時間之內(nèi)會一直嘗試獲取鎖直到超時. 為 0 表示失敗后直接返回不等待
  
* @param int 當(dāng)前鎖的最大生存時間(秒), 必須大于 0 . 如果超過生存時間后鎖仍未被釋放, 則系統(tǒng)會自動將其強(qiáng)制釋放
  
* @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設(shè)置生存時間
        $this->redis->expire($redisKey, $expire);
        
//將最大生存時刻記錄在一個數(shù)組里面
        $this->lockedNames[$name] = $expireAt;
        return true;
      }
 
      
//以秒為單位,返回$redisKey 的剩余生存時間
      $ttl = $this->redis->ttl($redisKey);
      
// TTL 小于 0 表示 key 上沒有設(shè)置生存時間(key 不會不存在, 因?yàn)榍懊?setnx 會自動創(chuàng)建)
      
// 如果出現(xiàn)這種情況, 那就是進(jìn)程在某個實(shí)例 setnx 成功后 crash 導(dǎo)致緊跟著的 expire 沒有被調(diào)用. 這時可以直接設(shè)置 expire 并把鎖納為己用
      if($ttl  0) {
        $this->redis->set($redisKey, (string)$expireAt, $expire);
        $this->lockedNames[$name] = $expireAt;
        return true;
      }
 
      
// 設(shè)置了不等待或者已超時
      if($timeout = 0 || microtime(true) > $timeoutAt) break;
 
      
// 掛起一段時間再試
      usleep($waitIntervalUs);
    }
 
    return false;
  }
 
  
/**
  
* 給當(dāng)前鎖增加指定的生存時間(秒), 必須大于 0
  
*
  
* @param string 鎖的標(biāo)識名
  
* @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;
  }
 
  
/**
  
* 判斷當(dāng)前是否擁有指定名稱的鎖
  
*
  
* @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 鎖的標(biāo)識名
  
*/
  public function unlock($name) {
    if($this->isLocking($name)) {
      if($this->redis->deleteKey("Lock:$name")) {
        unset($this->lockedNames[$name]);
        return true;
      }
    }
    return false;
  }
 
  
/** 釋放當(dāng)前已經(jīng)獲取到的所有鎖 */
  public function unlockAll() {
    $allSuccess = true;
    foreach($this->lockedNames as $name => $item) {
      if(false === $this->unlock($name)) {
        $allSuccess = false;
      }
    }
    return $allSuccess;
  }
}

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

您可能感興趣的文章:
  • redis中使用java腳本實(shí)現(xiàn)分布式鎖
  • Redis實(shí)現(xiàn)分布式鎖的幾種方法總結(jié)
  • 基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列
  • Redis分布式鎖的實(shí)現(xiàn)方式(redis面試題)
  • Redis分布式鎖實(shí)現(xiàn)方式及超時問題解決
  • redis實(shí)現(xiàn)分布式的方法總結(jié)
  • Redis分布式非公平鎖的使用

標(biāo)簽:澳門 揚(yáng)州 景德鎮(zhèn) 唐山 廣東 香港 贛州 林芝

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis上實(shí)現(xiàn)分布式鎖以提高性能的方案研究》,本文關(guān)鍵詞  Redis,上,實(shí)現(xiàn),分布式,鎖,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis上實(shí)現(xiàn)分布式鎖以提高性能的方案研究》相關(guān)的同類信息!
  • 本頁收集關(guān)于Redis上實(shí)現(xiàn)分布式鎖以提高性能的方案研究的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    wwwwxxxxx欧美| 91精品国产综合久久精品性色| 欧美国产一区在线| 色综合久久久网| 亚洲品质自拍视频| 91美女片黄在线| 亚洲国产精品久久不卡毛片| 麻豆91在线观看| 日韩精品一区二区三区中文不卡| 国产高清精品网站| 国产精品久久毛片av大全日韩| 久久综合色鬼综合色| 欧美久久高跟鞋激| 成人免费视频免费观看| 成人午夜视频在线| 国产欧美久久久精品影院| 国产精华液一区二区三区| 亚洲人妖av一区二区| 国产一区二区免费视频| 亚洲欧美另类久久久精品2019| 亚洲日本电影在线| 欧美视频在线观看一区二区| 中文在线免费一区三区高中清不卡| 精品一区二区在线看| 国产一区二区三区免费播放| 欧美绝品在线观看成人午夜影视| 国产精品久久毛片av大全日韩| 日韩免费观看高清完整版| 欧美日本在线一区| 精品综合久久久久久8888| 国产精品久久久久久户外露出 | 青青草原综合久久大伊人精品优势 | 久久久久久免费| 奇米色一区二区| 亚洲成在线观看| 久久亚洲综合色| 日韩西西人体444www| 久久久亚洲高清| 亚洲视频在线一区| 色噜噜狠狠色综合中国| 国产精品日日摸夜夜摸av| 日韩欧美亚洲国产另类| 精品国产乱码久久| 日韩欧美亚洲一区二区| 亚洲资源在线观看| 免费在线观看精品| 青青草一区二区三区| 欧美中文字幕不卡| 亚洲图片欧美综合| 无吗不卡中文字幕| 日韩二区三区四区| 久久国产精品72免费观看| 91视视频在线观看入口直接观看www | 色系网站成人免费| 国产高清久久久久| 亚洲成人中文在线| 精品伦理精品一区| 亚洲成av人片| 精品视频123区在线观看| 在线综合亚洲欧美在线视频| 亚洲欧美日韩电影| 成人一级视频在线观看| 狠狠色丁香久久婷婷综| 日韩中文字幕麻豆| 亚洲一区二区高清| 成人午夜av影视| 欧美日韩激情在线| 视频一区二区国产| 国产呦萝稀缺另类资源| 亚洲蜜桃精久久久久久久| 精品国产第一区二区三区观看体验| 丝袜诱惑制服诱惑色一区在线观看 | 欧美日韩一区二区三区四区五区 | 精品视频在线看| 国产日韩欧美a| 国产精品毛片久久久久久久| 97超碰欧美中文字幕| 亚洲视频中文字幕| 精品久久一区二区| 91一区二区三区在线观看| 99re视频精品| 激情都市一区二区| 日韩欧美一级精品久久| 国产大片一区二区| 91免费观看视频| 欧美性一二三区| 国产亚洲精品中文字幕| 秋霞午夜av一区二区三区| 91精品国产福利| 国产一区日韩二区欧美三区| 久久超级碰视频| 91久久一区二区| 波多野结衣中文字幕一区| 日韩高清一级片| 亚洲一级二级在线| 日韩电影免费一区| 精品中文字幕一区二区| 99精品黄色片免费大全| 久久精品免费观看| 久久综合资源网| 中文字幕免费一区| 天天做天天摸天天爽国产一区| 日韩欧美久久一区| 日韩avvvv在线播放| 欧美性大战久久久| 94-欧美-setu| 国产精品久久久久久久久搜平片 | 91精品国产色综合久久不卡电影| 国产精品网站一区| 日韩专区在线视频| 欧美三级电影精品| av中文字幕不卡| 欧美日韩精品欧美日韩精品 | 精品午夜久久福利影院| 日本欧美大码aⅴ在线播放| 午夜精品久久久久久久99樱桃| 精品在线播放免费| 成人在线视频一区| 88在线观看91蜜桃国自产| 一本久道中文字幕精品亚洲嫩| 欧美图片一区二区三区| 久久久久99精品国产片| 国产精品欧美综合在线| 懂色av中文字幕一区二区三区| 欧美色手机在线观看| 国产精品视频yy9299一区| 亚洲1区2区3区视频| 91成人在线精品| 丝袜美腿亚洲一区| 欧美男男青年gay1069videost | 日韩精品一区二区三区四区视频| 色婷婷综合久久久久中文一区二区| 一区二区三区不卡视频在线观看| 一区在线播放视频| 香蕉成人伊视频在线观看| 欧美在线播放高清精品| 欧美日韩国产成人在线91| 亚洲第一av色| 欧美在线不卡视频| 亚洲色图欧洲色图婷婷| 热久久一区二区| 成人av网在线| 欧美亚洲综合久久| 欧美伊人精品成人久久综合97| 日韩黄色免费电影| 日本高清不卡aⅴ免费网站| 国产蜜臀av在线一区二区三区| 亚洲国产成人在线| 国产精品小仙女| 中文字幕一区日韩精品欧美| 国产精品一区二区三区乱码| 国产精品无遮挡| 成人性生交大片免费看中文网站| 亚洲综合一区二区| 17c精品麻豆一区二区免费| 国产一区二区视频在线播放| 亚洲自拍都市欧美小说| 欧洲人成人精品| 一区二区三区色| 国产精品美女久久久久aⅴ国产馆| 色综合色综合色综合| 国产风韵犹存在线视精品| 国产精品卡一卡二| 91黄色小视频| 99re亚洲国产精品| 美女在线一区二区| 日日夜夜免费精品| 国产精品女上位| 欧美一级日韩一级| 欧美日韩午夜精品| 麻豆免费精品视频| 精品婷婷伊人一区三区三| 久久精品日韩一区二区三区| 一区二区国产盗摄色噜噜| 欧美性受xxxx黑人xyx| 久久99国产精品久久99果冻传媒| 91精品国产综合久久久久久| 奇米色一区二区三区四区| 1000精品久久久久久久久| 国产一区不卡在线| 日韩精品电影一区亚洲| 亚洲第一成年网| 色综合咪咪久久| 欧美日韩一区二区三区四区五区| 欧美日韩一区高清| 国产精品网站导航| 日韩精品久久久久久| 轻轻草成人在线| 国产最新精品免费| 18涩涩午夜精品.www| 日本一区二区三区高清不卡| 99久久综合精品| 国产.精品.日韩.另类.中文.在线.播放| 天堂蜜桃一区二区三区| 欧美激情在线一区二区| 国产精品久久久久久久久久免费看 | 国产又黄又大久久| 日日夜夜免费精品| 国产综合色视频| 玖玖九九国产精品|