>  기사  >  백엔드 개발  >  PHP는 대규모 동시성에서 2차 쓰기를 방지하기 위해 어떻게 redis를 사용합니까?

PHP는 대규모 동시성에서 2차 쓰기를 방지하기 위해 어떻게 redis를 사용합니까?

小云云
小云云원래의
2018-03-27 13:30:591265검색

PHP는 읽기 및 쓰기 작업을 위해 redis를 호출합니다. 즉, key1을 읽고 내용이 없으면 내용을 작성합니다. 그러나 동시에 여러 PHP 프로세스가 동시에 작성됩니다. , 잠금을 추가해야 합니다. 즉, 잠금을 획득하는 PHP 프로세스에 쓰기 권한이 있습니다.

  1. $lock_key = 'LOCK_PREFIX' . $redis_key;  
    $is_lock = $redis->setnx($lock_key, 1); // 加锁
    if($is_lock == true){ // 获取锁权限
        $redis->setex($redis_key, $expire, $data); // 写入内容
        // 释放锁
        $redis->del($lock_key);  
    }else{  
        return true; // 获取不到锁权限,直接返回
    }

아이디어는 다음과 같습니다. 잠금 키를 설정하고, setnx는 원자성 작업이며, 단 하나의 프로세스만 성공적으로 쓸 수 있으며, 쓰기가 성공하면(잠금 권한을 얻었음을 나타냄) true를 반환합니다. 내용을 작성하고 잠금을 해제하면 삭제됩니다. 잠금 키입니다. 잠금 반환을 직접 얻을 수 없는 프로세스입니다. 그런데 여기서 잠금 권한을 획득한 프로세스가 잠금을 획득한 후 실행 시 오류를 보고하는 상황이 발생하는데, 이로 인해 잠금이 해제되지 않고, 이 경우 그렇지 않은 프로세스에 내용을 쓸 수 없게 됩니다. 잠금 권한을 얻으려면 잠금의 남은 유효 시간을 판단해야 하며, -1인 경우 잠금 유효 시간을 5초로 설정합니다(5초는 잠금을 얻는 프로세스의 실행 시간으로 예약됨). 충분합니다). 개선된 코드:

  1. $lock_key = 'LOCK_PREFIX' . $redis_key;  
    $is_lock = $redis->setnx($lock_key, 1); // 加锁
    if($is_lock == true){ // 获取锁权限
        $redis->setex($redis_key, $expire, $data); // 写入内容
        // 释放锁
        $redis->del($lock_key);  
    }else{  
        // 防止死锁
        if($redis->ttl($lock_key) == -1){  
            $redis->expire($lock_key, 5);  
        }  
        return true; // 获取不到锁权限,直接返回
    }

위 내용은 PHP는 대규모 동시성에서 2차 쓰기를 방지하기 위해 어떻게 redis를 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.