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 중국어 웹사이트의 기타 관련 기사를 참조하세요!