```
/**
* Created by PhpStorm.
* User: wangjianglong
* Date: 2020/4/16
* Time: 14:57
*/
/**
* 實(shí)現(xiàn)Redis分布式鎖
*/
$redis=new Redis();
$redis->connect("127.0.0.1",6379);
$key? ? ? ? = 'test';? ? ? //要更新信息的緩存KEY
$lockKey? ? = 'lock:'.$key; //設(shè)置鎖KEY
$lockExpire = 10;? ? ? ? ? //設(shè)置鎖的有效期為10秒
//獲取緩存信息
$result = $redis->get($key);
//判斷緩存中是否有數(shù)據(jù)
if(empty($result)){
? ? $status=TRUE;
? ? while ($status){
? ? ? ? //設(shè)置鎖值為當(dāng)前時(shí)間戳 + 有效期
? ? ? ? $lockValue = time() + $lockExpire;
? ? ? ? /**
? ? ? ? * 創(chuàng)建鎖
? ? ? ? * 試圖以$lockKey為key創(chuàng)建一個(gè)緩存,value值為當(dāng)前時(shí)間戳
? ? ? ? * 由于setnx()函數(shù)只有在不存在當(dāng)前key的緩存時(shí)才會(huì)創(chuàng)建成功
? ? ? ? * 所以,用此函數(shù)就可以判斷當(dāng)前執(zhí)行的操作是否已經(jīng)有其他進(jìn)程在執(zhí)行了
? ? ? ? * @var [type]
*/
? ? ? ? $lock=$redis->setnx($lockKey,$lockValue);
? ? ? ? /**
? ? ? ? * 滿足兩個(gè)條件中的一個(gè)即可進(jìn)行操作
? ? ? ? * 1、上面一步創(chuàng)建鎖成功;
? ? ? ? * 2、? 1)判斷鎖的值(時(shí)間戳)是否小于當(dāng)前時(shí)間? ? $redis->get()
? ? ? ? *? ? ? 2)同時(shí)給鎖設(shè)置新值成功? ? $redis->getset()
*/
? ? ? ? if(!empty($lock) || ($redis->get($lockKey)<time() && $redis->getSet($lockKey, $lockValue) < time())){
? ? ? ? ? ? //給鎖設(shè)置生存時(shí)間
? ? ? ? ? ? $redis->expire($lockKey,$lockExpire);
? ? ? ? ? ? //******************************
? ? ? ? ? ? //此處執(zhí)行插入、更新緩存操作...
//******************************
? ? ? ? ? ? //以上程序走完刪除鎖
? ? ? ? ? ? //檢測(cè)鎖是否過期,過期鎖沒必要?jiǎng)h除
? ? ? ? ? ? if($redis->ttl($lockKey)){
? ? ? ? ? ? ? ? $redis->del($lockKey);
}
? ? ? ? ? ? echo "finished";
? ? ? ? ? ? $status=false;
? ? ? ? }else{
? ? ? ? ? ? /**
? ? ? ? ? ? * 如果存在有效鎖這里做相應(yīng)處理
? ? ? ? ? ? *? ? ? 等待當(dāng)前操作完成再執(zhí)行此次請(qǐng)求
? ? ? ? ? ? *? ? ? 直接返回
? ? ? ? ? ? */
? ? ? ? ? ? sleep(2);//等待2秒后再嘗試執(zhí)行操作
? ? ? ? }
}
}
```