校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Redis上實現分布式鎖以提高性能的方案研究

Redis上實現分布式鎖以提高性能的方案研究

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

背景:

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

項目實踐

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


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

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

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

?php
 
require_once 'RedisFactory.php';
 
/**
* 在 Redis 上實現的分布式鎖
*/
class RedisLock {
  
//單例模式
  private static $_instance = null;
  public static function instance() {
    if(self::$_instance == null) {
      self::$_instance = new RedisLock();
    }
    return self::$_instance;
  }
 
  
//redis對象變量
  private $redis;
  
//存放被鎖的標志名的數組
  private $lockedNames = array();
 
  public function __construct() {
    
//獲取一個 RedisString 實例
    $this->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  0) {
        $this->redis->set($redisKey, (string)$expireAt, $expire);
        $this->lockedNames[$name] = $expireAt;
        return true;
      }
 
      
// 設置了不等待或者已超時
      if($timeout = 0 || microtime(true) > $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實現分布式鎖了。

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

標簽:澳門 揚州 景德鎮 唐山 廣東 香港 贛州 林芝

巨人網絡通訊聲明:本文標題《Redis上實現分布式鎖以提高性能的方案研究》,本文關鍵詞  Redis,上,實現,分布式,鎖,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis上實現分布式鎖以提高性能的方案研究》相關的同類信息!
  • 本頁收集關于Redis上實現分布式鎖以提高性能的方案研究的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91亚洲男人天堂| 91日韩在线专区| 成人高清免费观看| 欧美日高清视频| 国产精品国产a| 狠狠狠色丁香婷婷综合久久五月| 99久久精品费精品国产一区二区| 精品少妇一区二区三区日产乱码| 夜夜嗨av一区二区三区网页| 国产一区二区三区免费观看| 欧美日韩国产一区| 亚洲欧美电影院| 成人激情午夜影院| 久久九九久久九九| 精品亚洲免费视频| 日韩久久久久久| 日韩激情视频网站| 欧美日韩国产中文| 亚洲午夜激情网站| 欧美性大战xxxxx久久久| 国产精品国产自产拍高清av王其| 久久国产三级精品| 日韩欧美一级精品久久| 日韩国产精品久久| 3d成人h动漫网站入口| 亚洲精品成人精品456| 91浏览器在线视频| 亚洲视频一二区| a级高清视频欧美日韩| 中文字幕在线一区| av亚洲精华国产精华精| 国产精品夫妻自拍| 91首页免费视频| 亚洲精品视频免费观看| 色999日韩国产欧美一区二区| 国产精品国产自产拍高清av | 奇米精品一区二区三区四区| 欧美日韩在线播放一区| 亚洲一区二区综合| 欧美精品v国产精品v日韩精品| 亚洲成在人线在线播放| 欧美日韩中字一区| 另类小说图片综合网| 久久午夜老司机| 成人18视频在线播放| 亚洲精品乱码久久久久久| 欧美日韩亚洲综合在线 | 成人做爰69片免费看网站| 国产精品久久三区| 在线看日本不卡| 日本亚洲最大的色成网站www| 欧美成人福利视频| 粉嫩高潮美女一区二区三区| 《视频一区视频二区| 欧美在线高清视频| 蜜桃免费网站一区二区三区| 国产日产欧美一区二区视频| 成人v精品蜜桃久久一区| 亚洲一区二区在线视频| 欧美大黄免费观看| 91欧美激情一区二区三区成人| 亚洲一级在线观看| 欧美成人精品福利| 99re这里只有精品6| 日韩精品一卡二卡三卡四卡无卡| 久久亚洲综合av| 日本韩国欧美在线| 精品制服美女丁香| 亚洲五码中文字幕| 国产目拍亚洲精品99久久精品| 91国产免费看| 国产福利一区二区三区在线视频| 亚洲人成网站色在线观看| 欧美一区二区视频在线观看2020| 国产91在线|亚洲| 亚洲综合男人的天堂| 国产亚洲精品久| 欧美一区二区在线播放| 91视频www| 国产成人自拍网| 日日骚欧美日韩| 亚洲女与黑人做爰| 精品国产电影一区二区| 在线看日韩精品电影| 国产91在线观看丝袜| 日本不卡免费在线视频| 亚洲综合色区另类av| 国产欧美一区二区精品性色超碰| 欧美在线一二三| 99久久久精品| 高潮精品一区videoshd| 久久精品av麻豆的观看方式| 亚洲午夜精品在线| 亚洲乱码一区二区三区在线观看| 欧美精品一区二区三区四区| 欧美少妇xxx| 在线欧美日韩国产| 99久久国产综合精品麻豆| 高清不卡一区二区在线| 国产精品亚洲综合一区在线观看| 亚洲bt欧美bt精品| 亚洲午夜av在线| 亚洲一二三四区| 一区二区三区精品视频| 国产精品麻豆一区二区| 国产精品丝袜91| 国产精品少妇自拍| 中文字幕av不卡| 国产精品午夜久久| 国产女主播视频一区二区| 久久精品亚洲精品国产欧美| 精品国产一区二区国模嫣然| 欧美mv和日韩mv的网站| 日韩欧美一级精品久久| 精品国产污网站| 久久综合九色欧美综合狠狠| 精品精品欲导航| 久久精品一二三| 国产精品欧美极品| 一区二区三区欧美日| 亚洲一区二区精品3399| 亚洲第一福利一区| 日本亚洲三级在线| 国产一区二区免费看| 成人av网站免费| 日本韩国欧美在线| 91精品婷婷国产综合久久性色 | 日本电影欧美片| 在线观看国产精品网站| 欧日韩精品视频| 欧美高清激情brazzers| 精品久久久久久久久久久久包黑料| 日韩久久免费av| 一区免费观看视频| 亚洲国产精品一区二区久久 | 久久久亚洲午夜电影| 国产欧美一区二区精品婷婷| 国产精品成人一区二区艾草| 一区二区高清免费观看影视大全 | 精品久久一区二区三区| 久久天天做天天爱综合色| 国产精品久久久久9999吃药| 一区二区激情视频| 精品在线一区二区三区| 97久久精品人人澡人人爽| 777xxx欧美| 国产色一区二区| 亚洲一级在线观看| 国产一区二区精品久久99| 91丨porny丨国产| 欧美成人猛片aaaaaaa| 亚洲欧美日韩国产综合在线| 美女视频网站黄色亚洲| 成人18精品视频| 日韩精品在线看片z| 亚洲免费观看高清完整版在线| 日本视频在线一区| 成人h版在线观看| 日韩精品自拍偷拍| 亚洲最新在线观看| 国产成人精品亚洲日本在线桃色| 日本黄色一区二区| 中文字幕第一页久久| 日韩和欧美的一区| 色妞www精品视频| 久久久久久9999| 强制捆绑调教一区二区| 在线欧美小视频| 中文字幕在线观看不卡| 国内精品视频一区二区三区八戒| 欧美撒尿777hd撒尿| 国产精品乱码人人做人人爱| 麻豆国产精品官网| 欧美性猛片xxxx免费看久爱| 日本一区二区三级电影在线观看 | 久久国产精品第一页| 在线观看视频91| 国产精品麻豆99久久久久久| 久久精品久久久精品美女| 欧美日韩一区在线观看| 国产精品美女久久久久久久久 | 精品中文字幕一区二区| 欧美精选午夜久久久乱码6080| 亚洲色欲色欲www在线观看| 国产成人av电影在线| 久久一区二区视频| 久久99久久99小草精品免视看| 91精品国模一区二区三区| 亚洲h精品动漫在线观看| 欧美午夜在线一二页| 亚洲欧美日韩国产综合| 91网上在线视频| 亚洲欧美精品午睡沙发| 北条麻妃国产九九精品视频| 国产精品免费视频一区| thepron国产精品| 亚洲欧美日韩国产成人精品影院 | 91精品婷婷国产综合久久| 亚洲第一综合色| 欧美日韩视频第一区|