一個簡單的PHP REDIS分佈式鎖類 外部使用獲取鎖和釋放鎖來處理本身的業務邏輯便可git
/** * Class DistributedLocks 基於redis的分佈式鎖 */ class DistributedLocks { /** * 獲取鎖函數 * @param $key string 鎖key * @param $expire string 鎖定的時間 * @return bool 獲取結果 失敗false 成功true 外面作業務邏輯處理 */ public function lock($key, $expire) { // 判斷參數是否爲空 if (empty($key) || empty($expire)) { return false; } $redis = Predis::getInstance(); $result = $redis->get($key); if (!$result) { // 若是沒有值 設置值 $lock_result = SETNX($key, time() + $expire); if ($lock_result) { // 加鎖成功 設置過時時間 $redis->expire($key, $expire); return true; } } else { // 有值 判斷是否 過時 防止死鎖 if ($redis->get($key) < time()) { // 上鎖判斷上一個值是否過時 防止其餘進程已經上鎖 if ($redis->getSet($key, time() + $expire) < time()) { $redis->expire($key, $expire); return true; } } } return false; } /** * 釋放鎖函數 * @param $key string 鎖key * @return bool 釋放結果 */ public function release($key) { $redis = Predis::getInstance(); if ($redis->ttl($key)) { $redis->del($key); } return true; } }
github地址github