正確的企業(yè)郵箱格式seo百度發(fā)包工具
分布式鎖
如果是強(qiáng)一致性保證,在獲取鎖或者失敗后引入數(shù)據(jù)庫存儲掃表、mq 等方式進(jìn)行補(bǔ)償
如果可以容忍少量異常就不需要考慮了
像這里的代碼,沒吃建立一個鏈接鋪貨,性能損耗時間延遲也是很大的,也可在一塊代碼中進(jìn)行服務(wù),這里是臨時修復(fù)一個 bug,問題不大
基于 Redis 實(shí)現(xiàn)
// 加鎖
function acquireLock($lockKey, $lockValue, $expireTime)
{return $this->getRedisConnection()->set($lockKey, $lockValue, array('nx', 'ex' => $expireTime));
}// 釋放鎖
function releaseLock($lockKey, $lockValue)
{// 使用 Lua 腳本原子性地釋放鎖$script = 'if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])elsereturn 0end';return $this->getRedisConnection()->eval($script, array($lockKey, $lockValue), 1);
}// 重試加鎖
function retryAcquireLock($lockKey, $lockValue, $expireTime, $maxRetries, $retryInterval)
{for ($i = 0; $i < $maxRetries; $i++) {if ($this->acquireLock($lockKey, $lockValue, $expireTime)) {return true;}sleep($retryInterval);}return false;
}
使用示例
// 使用示例
$lockKey = 'my_lock_key'; // key 名稱
$lockValue = uniqid(); // 值 保證不釋放錯
$expireTime = 10; // 總體過期時間
$maxRetries = 4; // 最大重試次數(shù)
$retryInterval = 2; // 重試間隔
// 重試間隔 * 次數(shù) 不能大于整體過期時間
if ($lockManager->retryAcquireLock($lockKey, $lockValue, $expireTime, $maxRetries, $retryInterval)) {echo "成功獲取鎖。\n";// 模擬臨界區(qū)代碼執(zhí)行sleep(5);$lockManager->releaseLock($lockKey, $lockValue);echo "釋放鎖。\n";
} else {echo "無法獲取鎖。\n";
}
[PHP 實(shí)現(xiàn) redis 分布式鎖 |
Laiyong Wang](http://laiyong.wang/2024/06/15/PHP-實(shí)現(xiàn)-redis-分布式加鎖/)