PHP 개발 시 동시성 문제를 해결하기 위한 여러 구현 방법:
권장: php 서버
옵션 1: 파일 잠금 전용 잠금 사용
flock 함수는 파일 잠금을 얻는 데 사용됩니다. 하나의 스레드로 획득 가능하며, 잠금을 획득하지 못한 다른 스레드는 차단되거나 실패하며, 잠금 획득 시 재고가 0보다 큰 경우 먼저 주문하고 재고를 줄인 후 해제합니다.
옵션 2: Mysql 데이터베이스에서 제공하는 비관적 잠금 사용
Innodb 스토리지 엔진은 행 수준 잠금을 지원합니다. 데이터 행이 잠기면 다른 프로세스가 데이터 행에서 작동할 수 없습니다.
쿼리 및 잠금 행 먼저:
select stock_num from table where id=1 for update if(stock_num > 0){ //下订单 update table set stock_num=stock-1 where id=1 }
옵션 3: 대기열
을 사용하여 사용자의 주문 요청을 대기열에 순차적으로 저장하고 백그라운드에서 별도의 프로세스를 사용하여 대기열의 주문 요청을 처리합니다
옵션 4: Redis 사용
Redis 작업은 모두 원자적이므로 Redis에 제품 재고를 저장할 수 있으며, 주문하기 전에 재고에 대한 감소 작업을 수행할 수 있습니다. 반환된 값이 0보다 크거나 같으면 주문할 수 있습니다. 그렇지 않으면 주문할 수 없습니다.
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }
기타 동시성 문제:
실제 애플리케이션에서는 많은 경우 캐시가 실패하면 데이터를 데이터베이스에서 가져오고 캐시가 재설정됩니다. 이때 동시성이 크면 많은 프로세스가 동시에 데이터베이스에서 데이터를 가져오므로 많은 요청이
데이터베이스에 침투하여 데이터베이스가 충돌할 수 있습니다. 문제를 해결하기 위해
$data = $cache->get('key'); if(!$data){ $fp = fopen('lockfile'); if(flock($fp, LOCK_EX)){ $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了 if(!$data){ $data = mysql->query(); $cache->set('key', $data); } flock($fp, LOCK_UN); } fclose($fp); }
위 내용은 PHP의 동시성 방법은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!