成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:103日期: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
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人激情综合网站| 成人在线视频一区| 国产精品一区二区不卡| 久久激情综合| 亚洲午夜影视影院在线观看| 伊人久久亚洲热| 日本一区免费视频| 91色综合久久久久婷婷| 久久综合九色欧美综合狠狠| 国产成人综合在线播放| 91麻豆精品国产91久久久使用方法 | 亚洲影院久久精品| 日韩视频在线播放| 亚洲乱码日产精品bd| a91a精品视频在线观看| 国产精品美女久久久久久久久久久| 牛人盗摄一区二区三区视频| 久久久国际精品| 欧美精品一区二区三区久久久竹菊| 久久久欧美精品sm网站| 午夜精品免费| 亚洲美女视频一区| 免费精品视频| 日本视频中文字幕一区二区三区| 在线亚洲欧美专区二区| 亚洲成a人片综合在线| 久久国产免费| 日韩av一二三| 欧美人与z0zoxxxx视频| 国产.欧美.日韩| 久久奇米777| 黄色国产精品| 亚洲欧美电影一区二区| 99精品热6080yy久久| 一区二区三区欧美日| 六月婷婷久久| 美腿丝袜亚洲综合| 欧美日韩久久久| 国产成人免费av在线| 精品久久人人做人人爽| av在线不卡观看免费观看| 国产午夜精品美女毛片视频| 好吊视频一区二区三区四区| 亚洲黄色尤物视频| 久久久福利视频| 久久国产精品99久久久久久老狼| 欧美精品国产精品| www.亚洲在线| 国产精品久久网站| 一本久久知道综合久久| 水野朝阳av一区二区三区| 欧美日本在线观看| 99精品久久只有精品| 亚洲欧洲日韩av| 久久久久久9| 韩国精品在线观看| 久久伊人中文字幕| 亚洲精品日韩在线观看| 天天综合色天天综合| 欧美另类高清zo欧美| 99re热这里只有精品视频| 椎名由奈av一区二区三区| 美女亚洲精品| 国产成人一级电影| 国产精品第五页| 久久综合电影| 成人毛片在线观看| 亚洲女与黑人做爰| 欧美三级日韩三级| 欧美区国产区| 亚洲国产视频网站| 日韩一区二区三区电影在线观看 | 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 精品一区二区在线视频| 26uuu精品一区二区三区四区在线| 国语自产精品视频在线看8查询8| 夜夜操天天操亚洲| 欧美丰满一区二区免费视频| 亚洲欧美综合国产精品一区| 亚洲国产精品尤物yw在线观看| 国产麻豆精品95视频| 国产精品卡一卡二| 欧美怡红院视频| 色综合一区二区三区| 亚洲国产精品久久久久婷婷884| 制服丝袜亚洲网站| 韩国欧美一区| 精品制服美女丁香| 亚洲欧洲一区二区在线播放| 欧美亚洲高清一区| 欧美aa国产视频| 亚洲h动漫在线| 久久品道一品道久久精品| 久久国产精品亚洲77777| bt欧美亚洲午夜电影天堂| 夜夜嗨av一区二区三区中文字幕 | 亚洲一区二区三区影院| 51精品秘密在线观看| 精品999日本| 看电影不卡的网站| 日韩美女精品在线| 91精品在线观看入口| 久久久久高清| 欧美a级片一区| 久草在线在线精品观看| 成人免费小视频| 日韩欧美一区在线| 久久精品国语| 欧美久久综合| 久久99国产精品久久99果冻传媒| 国产精品二区一区二区aⅴ污介绍| 欧美最猛性xxxxx直播| 伊人久久大香线蕉综合热线| 韩国精品主播一区二区在线观看| 亚洲视频一二区| 欧美成人精品二区三区99精品| 久久久99爱| 亚洲人成人一区二区三区| www.日韩大片| 精品一区精品二区高清| 一区二区高清在线| 国产精品剧情在线亚洲| 欧美电影免费观看高清完整版在 | 狂野欧美性猛交xxxx巴西| 欧美精品啪啪| 国产91精品免费| 蜜芽一区二区三区| 亚洲欧洲av在线| 精品久久人人做人人爱| 欧美色图12p| 久久久久久穴| 在线观看亚洲| 91视频www| 成人美女视频在线观看18| 久久精品久久99精品久久| 亚洲一区在线免费观看| 国产精品每日更新在线播放网址| 日韩欧美国产综合一区 | 亚洲国产高清一区二区三区| 不卡高清视频专区| 经典一区二区三区| 视频一区免费在线观看| 亚洲黄色av一区| 中文字幕免费一区| 精品国产髙清在线看国产毛片| 精品视频123区在线观看| 另类亚洲自拍| 国产精品一级久久久| 99国产精品国产精品毛片| 国产一区二区三区香蕉 | jizzjizzjizz欧美| 国内久久婷婷综合| 五月激情六月综合| 亚洲另类在线视频| 中文字幕视频一区二区三区久| 久久综合九色综合97婷婷女人| 日韩视频一区二区在线观看| 欧美日韩一区二区在线观看视频| 久久久天天操| 国产精品日韩欧美一区| 日韩午夜av| 国产综合自拍| 91麻豆成人久久精品二区三区| 豆国产96在线|亚洲| 国产精品自拍在线| 国产一区二区三区综合| 国产一区在线观看视频| 久久精品国产99国产| 久热成人在线视频| 看电视剧不卡顿的网站| 老司机免费视频一区二区| 久久精品国产999大香线蕉| 美女在线视频一区| 免费在线观看不卡| 青娱乐精品视频| 麻豆91免费看| 精品亚洲aⅴ乱码一区二区三区| 日本不卡视频一二三区| 日本在线播放一区二区三区| 日本午夜一区二区| 六月丁香综合在线视频| 久久不见久久见中文字幕免费| 久久精品av麻豆的观看方式| 老司机免费视频一区二区三区| 久久国产剧场电影| 国产在线观看一区二区| 国产精品小仙女| 成人美女视频在线观看| 91麻豆123| 国产一区久久| 亚洲精品美国一| 亚洲国产成人tv| 午夜精品久久久久久久| 日韩专区中文字幕一区二区| 蜜臀av性久久久久蜜臀aⅴ| 国产在线视频精品一区| 成人爱爱电影网址| 午夜国产欧美理论在线播放 | 91美女片黄在线观看91美女| 色综合一个色综合亚洲|