>백엔드 개발 >PHP 튜토리얼 >대규모 동시성에서 2차 쓰기를 방지하는 Redis에 대한 자세한 설명

대규모 동시성에서 2차 쓰기를 방지하는 Redis에 대한 자세한 설명

小云云
小云云원래의
2018-03-28 11:40:101450검색

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

$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초는 잠금을 얻는 프로세스의 실행 시간으로 예약됨). 충분합니다). 개선된 코드:

$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; // 获取不到锁权限,直接返回  
}


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

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