PHP REDIS分佈式鎖

一個簡單的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

相關文章
相關標籤/搜索