이 글에서는 PHP가 대규모 동시성에서 2차 쓰기를 방지하기 위해 Redis를 사용하는 방법을 주로 소개합니다. PHP가 잠금 메커니즘을 사용하여 Redis의 동시 읽기 및 쓰기를 구현하는 경우의 읽기 및 쓰기 오류를 예제 형식으로 설명합니다. 참고하세요
이 문서의 예에서는 PHP가 Redis를 사용하여 대규모 동시성에서 2차 쓰기를 방지하는 방법을 설명합니다. 참조용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.
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; // 获取不到锁权限,直接返回 }
위 내용은 PHP는 Redis를 사용하여 대규모 동시성에서 2차 쓰기를 방지하는 방법을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!