日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP使用redis實現分布式鎖的示例詳解

瀏覽:135日期:2022-06-06 14:38:03
目錄
  • 什么是分布式鎖
  • 實現原理
  • php實現代碼

最近在做一個領券功能的時候,發現在一定并發下會出現重復領券的問題。使用度娘一頓搜索操作之后,發現可以使用分布式鎖來解決這個問題。

什么是分布式鎖

分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式。在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,這個時候,便需要使用到分布式鎖。

實現原理

實現分布式鎖的原理很簡單,就是需要有一把鎖,多個服務同時去獲取鎖,但是只有一個服務能獲取到鎖。獲取到鎖的服務就可以執行自己的業務,沒有獲取到鎖的其他服務需要等待獲取到鎖的服務業務執行完成后釋放鎖,然后再次嘗試獲取鎖。

實現分布式的方案有很多種。如下

  • 基于數據庫實現分布式鎖,比如mysql
  • 基于緩存實現分布式鎖,比如redis
  • 基于Zookeeper實現分布式鎖

這里我們使用redis來實現分布式鎖,在執行業務之前先獲取一個key,如果key存在就說明已經有其他服務獲得鎖,這個時候需要等待或者返回系統繁忙。如果key不存在,說明沒有其他服務獲取鎖,把這個key保存到redis,然后執行業務,等待業務執行完就從redis中刪除這個key。

php實現代碼

<?php
 
class RedisLock
{
    protected $redis;
 
    public function __construct(){
    
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
 
$this->redis = $redis;
    }
    public function getLock($key){
$value = $this->redis->get($key);
return $value;
    }
 
    public function setLock($key,$value){
$this->redis->set($key,$value);
    }
 
    public function delLock($key){
$lineNumber = $thid->redis->del($key);
return $lineNumber;
    }
}
 
$key = "your_lock_key";
$value = time();
 
$redisLock = new RedisLock();
$isLock = $redisLock->get($key);
if($isLock) {
    //已有鎖,直接返回,不往下執行了
    return false;
}
 
//沒有鎖,加鎖
$redisLock->setLock($key,$value);
 
 
 
//todo 執行業務邏輯
sleep(5);
 
// 解鎖
$redisLock->delLock($key);

使用ab進行測試

 加鎖     
 加鎖     
 加鎖     
 加鎖     
 加鎖     
 加鎖     
 加鎖     
 加鎖     
 執行業務     
 解鎖     
 解鎖     
 執行業務     
 解鎖     
 執行業務     
 解鎖     
 執行業務     
 解鎖     
 解鎖     
 執行業務     
 解鎖     
 加鎖     
 執行業務     
 解鎖     
 加鎖     
 執行業務     
 解鎖

從測試結果來看,發現有多個執行業務,并沒有完全鎖住。這個是因為我們用的是redis的set命令。set 命令用于設置給定 key 的值。如果 key 已經存儲其他值, SET 就覆寫舊值,且無視類型。這樣會導致很多服務都能加鎖成功,而我們想要的是只有一個服務能加鎖成功。

要解決這個問題,需要了解redis的另一個命令setnx。setnx 命令在指定的 key 不存在時,為 key 設置指定的值。

<?php
 
class RedisLock
{
    protected $redis;
 
    public function __construct(){
    
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
 
$this->redis = $redis;
    }
    public function getLock($key){
$value = $this->redis->get($key);
return $value;
    }
 
    public function setLock($key,$value){
return $this->redis->setnx($key,$value);
    }
 
    public function delLock($key){
$lineNumber = $thid->redis->del($key);
return $lineNumber;
    }
}
 
$key = "your_lock_key";
$value = time();
 
$redisLock = new RedisLock();
$isLock = $redisLock->get($key);
if($isLock) {
    //已有鎖,直接返回,不往下執行了
    return false;
}
 
//沒有鎖,加鎖
$setLock = $redisLock->setLock($key,$value);
if(!$setLock) {
    //加鎖失敗
    return false;
}
 
 
//todo 執行業務邏輯
sleep(5);
 
// 解鎖
$redisLock->delLock($key);

再次使用ab進行測試

 加鎖      
 加鎖      
 加鎖      
 加鎖      
 加鎖      
 加鎖      
 加鎖      
 加鎖失敗      
 加鎖失敗      
 加鎖失敗      
 加鎖失敗      
 加鎖失敗      
 已鎖      
 已鎖      
 已鎖      
 執行業務      
 解鎖

從測試結果來看,在未加鎖的狀態下,有多個服務同時獲取加鎖,但是只有一個加鎖成功, 其他的都是返回加鎖失敗,再后面的服務更是直接返回已鎖。由此可見,加鎖成功。

那么到此就結束了嗎?其實并不是的。假如在已加鎖的情況執行業務,在業務過程中因為一些原因出現異常導致退出而沒有進行解鎖,那么將造成死鎖,后面的所有服務都無法再次獲取鎖。為了解決這個問題,我們需要對鎖設置一個過期的時間,防止死鎖的發生。

<?php
 
class RedisLock
{
    protected $redis;
 
    public function __construct(){
    
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
 
$this->redis = $redis;
    }
    public function getLock($key){
$value = $this->redis->get($key);
return $value;
    }
 
    public function setLock($key,$value,$second){
$setnx = $this->redis->setnx($key,$value);
if(!$setnx) {
    return $setnx;
}
$expire = $this->redis->expire($key,$second);
if(!$expire) {
    $this->redis->del($key);
}
 
return $expire;
    }
 
    public function delLock($key){
$lineNumber = $thid->redis->del($key);
return $lineNumber;
    }
}
 
$key = "your_lock_key";
$value = time();
 
$redisLock = new RedisLock();
$isLock = $redisLock->get($key);
if($isLock) {
    //已有鎖,直接返回,不往下執行了
    return false;
}
 
//沒有鎖,加鎖
$second = 5;
$setLock = $redisLock->setLock($key,$value,$second);
if(!$setLock) {
    //加鎖失敗
    return false;
}
 
 
//todo 執行業務邏輯
sleep(5);
 
// 解鎖
$redisLock->delLock($key);

以上就是PHP使用redis實現分布式鎖的示例詳解的詳細內容,更多關于PHP redis分布式鎖的資料請關注其它相關文章!

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人在线中文字幕| 亚洲尤物av| 嫩呦国产一区二区三区av| 国产亚洲精品精品国产亚洲综合| 三级在线观看一区二区| 一区二区精彩视频| 日韩av一区二| 国产精品对白| 国产一区二区三区天码| 国产精品国产三级在线观看| 国产精品多人| 日韩电影二区| 99久久精品网| 亚洲天堂av资源在线观看| 国产欧美日韩综合一区在线播放| 国产精品一区二区三区www| 久久三级中文| 免费成人网www| 91欧美精品| 日韩综合精品| 日韩一二三区在线观看| 国产一区一一区高清不卡| 国产在线不卡| 日本色综合中文字幕| 日韩av网站在线观看| 久久久久久色 | 久久gogo国模啪啪裸体| 国产黄大片在线观看| 99视频一区| 国产精品探花在线观看| 99精品视频在线观看免费播放| 亚洲精品国产日韩| 日本在线高清| 欧美日韩日本国产亚洲在线| 日韩精品91亚洲二区在线观看| 亚洲欧洲高清| 综合精品一区| 成人在线视频区| 亚洲欧美在线专区| 久久天堂av| 国产精品亚洲成在人线| 久久不射中文字幕| 久久精品国产成人一区二区三区| 亚洲激情精品| 岛国av在线播放| 视频一区二区三区在线| 日本不良网站在线观看| 久久精品xxxxx| av资源新版天堂在线| 日本免费在线视频不卡一不卡二| 久久久久一区| 久久精品亚洲| 日本欧美韩国一区三区| 欧美91福利在线观看| 精品理论电影在线| 日韩av一区二区三区四区| 99在线精品视频在线观看| 亚洲伊人av| 久久婷婷国产| 国产视频网站一区二区三区| 伊人精品在线| 深夜视频一区二区| 久久精品国产一区二区| 9国产精品视频| 欧美日韩视频免费观看| 久久精品国产久精国产| 日本午夜精品久久久久| 久久亚洲欧美| 国产精品日韩| 欧美日韩精品一本二本三本| av在线日韩| 国产精品久久久久蜜臀| 国产精品久久亚洲不卡| 欧美一级二区| 97精品国产99久久久久久免费| 免费在线观看视频一区| 亚洲精品小说| 免费视频国产一区| 久久久91麻豆精品国产一区| 日本欧美一区| 日韩精品社区| 午夜久久av| 日韩高清一区在线| 日韩中出av| 日韩欧美美女在线观看| 亚洲精品伊人| 日韩精品a在线观看91| 在线免费观看亚洲| 精品国产免费人成网站| 欧美xxxx中国| 亚洲国产欧美日本视频| 亚洲黄色免费av| 日韩av福利| 国产精品欧美三级在线观看| 国产精品尤物| 丰满少妇一区| 蜜臀国产一区| 九一成人免费视频| 国产手机视频一区二区 | 色88888久久久久久影院| 999国产精品| 激情综合在线| 老鸭窝毛片一区二区三区| 久久亚洲风情| 日韩二区三区四区| 美女精品视频在线| 欧美aa在线观看| av资源新版天堂在线| 久久免费国产| 亚洲欧美久久久| 午夜性色一区二区三区免费视频| 日韩精品免费一区二区夜夜嗨| 日韩av午夜在线观看| 久久av国产紧身裤| 天堂av在线| 另类av一区二区| 日韩精品一区二区三区av| 久久精品国产999大香线蕉 | 欧美日韩尤物久久| 狠狠久久婷婷| 美日韩精品视频| 久久狠狠亚洲综合| 成人午夜亚洲| 免费精品国产的网站免费观看| 最新亚洲国产| 国产一区二区三区久久| 国产综合婷婷| 日韩高清国产一区在线| 成人在线超碰| 亚洲一区二区动漫| 国产亚洲一区二区三区不卡| 色偷偷偷在线视频播放| 中文一区一区三区免费在线观 | 激情欧美丁香| 亚洲精品亚洲人成在线观看| 久久99影视| 日韩午夜av| 91精品麻豆| 婷婷成人在线| 欧美精品三级在线| 香蕉久久精品| 国产精品羞羞答答在线观看| 婷婷综合在线| 欧美成人精品午夜一区二区| 亚洲精品成人| 精品日本视频| 亚洲欧美专区| 日韩影院二区| 亚洲视频电影在线| 国产成人精品一区二区三区在线| 精品视频97| 中文字幕日韩高清在线| 亚洲精品美女91| 久久这里只有| 亚洲va久久| 久久久精品五月天| 久久av导航| 亚洲ww精品| 亚洲精品97| 人在线成免费视频| 69堂精品视频在线播放| 亚洲女同中文字幕| 久久97视频| 日本视频中文字幕一区二区三区| 久久久久久美女精品| 欧美激情视频一区二区三区在线播放| 亚洲女人av| 国产aⅴ精品一区二区四区| 免费成人在线影院| 欧美精品高清| 嫩草伊人久久精品少妇av杨幂| 免费日韩av| 亚洲二区精品| 中文字幕成在线观看| 国产精品色婷婷在线观看| 亚洲影视一区| 亚洲永久字幕| 亚洲天堂久久| 国产传媒av在线| 国产精品亚洲综合在线观看| 亚洲欧美成人综合| 欧美日韩一二三四| 蜜桃精品视频| 国产乱子精品一区二区在线观看 | 国产日韩1区| 日韩在线成人| 中文一区一区三区免费在线观| 国产一区视频在线观看免费| 国产成人久久精品麻豆二区| 国产精品黄色片| 国产精品自拍区| 国产日韩欧美在线播放不卡| 日韩欧美2区| 中文亚洲免费| 99视频精品免费观看| 日韩视频不卡| 欧美a级一区| 自由日本语亚洲人高潮| 激情综合网站| 91久久中文|