>  기사  >  백엔드 개발  >  PHP가 Redis 분산 잠금을 기반으로 높은 동시성과 반복 요청을 방지하는 방법

PHP가 Redis 분산 잠금을 기반으로 높은 동시성과 반복 요청을 방지하는 방법

青灯夜游
青灯夜游앞으로
2019-11-29 15:39:493029검색

PHP가 Redis 분산 잠금을 기반으로 높은 동시성과 반복 요청을 방지하는 방법

요구 사항:

먼저 시스템 확인의 예를 들어 보겠습니다. (A 채널 시스템, 기업 B 시스템, 외부 업체 C 시스템)

(1) B 기업 시스템 호출 수신 휴대폰을 확인하기 위한 A 채널 시스템, 신분증과 이름이 일치합니다.

(2) 채널 A 시스템은 외부 제조업체 C 시스템을 호출합니다.

(3) 채널 A 시스템은 결과를 비즈니스 시스템 B로 반환합니다.

이 세 가지 프로세스 중 (2) 프로세스, 외부 제조업체에 전화를 걸면 과금이 필요합니다.

B 비즈니스 시스템의 동시성이 매우 높을 때 동일한 3가지 요소 검증이 100개 있습니다. 동일한 세 가지 요소이므로 채널 A는 제조업체에 한 번만 전화하면 결과를 알 수 있습니다. 특정 요청이 아직 응답하지 않은 상태에서 다른 요청이 외부 시스템을 호출하는 것을 방지하기 위해 이때 잠금이 필요합니다

분산 잠금의 특징

● 원자성: 동시에 A 스레드는 하나만 있을 수 있습니다.

● 재진입: 동일한 개체(예: 스레드, 클래스)가 교착 상태 없이 반복적으로 잠금을 호출할 수 있습니다.

● 차단 가능: 잠금을 획득하기 전에 차단하고 기다릴 수만 있습니다.

 ● 고가용성: 프로그램 오류가 발생하거나 기계가 손상되더라도 잠금을 획득하고 해제할 수 있습니다.

 ● 고성능: 잠금 획득 및 해제 작업이 저렴합니다. .

달성하려면: 잠금, 잠금 감소, 잠금 시간 초과

구현 방법은 다음과 같습니다: 데이터베이스 mc redis 시스템 파일 사육사

이제 채널 시스템입니다. 100개의 동일한 비즈니스 요청이 전달되면 첫 번째 요청을 해야 합니다. 먼저 잠근 후 외부 제조사의 시스템에 요청하고 응답을 기다린 후 다른 키를 삽입한 후 잠금을 삭제하면 됩니다.

다른 요청은 먼저 잠금을 획득합니다. 잠금이 이미 존재하면 차례로 대기합니다. 잠금이 더 이상 존재하지 않으면 결과를 직접 쿼리합니다.

첫 번째 요청이 실패하고 결과가 제자리에 삽입되지 않은 경우 계속해서 잠금을 획득하고 외부 시스템에 쿼리합니다.

잠금 가져오기:

$redis->set('lock:手机号&身份证&姓名', 1, ['nx', 'ex'=>10]);

잠금 해제:

키를 직접 삭제하세요

잠금 시간 초과:

잠금 키에는 시간 초과 기간이 있습니다

redis set 명령의 새 버전은 분산 잠금을 구현할 수 있으며, 동시에 구현할 수 있습니다. 그렇지 않은 경우 설정된 항목과 시간 초과 항목만 있는 경우 제거됩니다.


4b7f0a7304beadcaaaaa0874072c18ecconnect("127.0.0.1",6379);
//高并发时防止重复请求

//渠道系统传递过来的key
$lockKey='lock:18806767777&37781991111629092&taoshihan';
$resultKey='res:18806767777&37781991111629092&taoshihan';

//如果已经查询过值,可以直接返回
$info=$redis->get($resultKey);
if($info){
    exit($info);
}

//如果没有值的,获取锁
$lock=$redis->set($lockKey, 1, ['nx', 'ex'=>10]);
if($lock){
    //请求外部系统获取结果,比如响应结果比较慢
    sleep(8);
    $info='{"name":"taoshihan"}';
    $ret=$redis->set($resultKey,$info);
    if($ret){
        //删除锁
        $redis->del($lockKey);
        exit($info);
    }
}
echo "请稍后重试!";

추천 학습: PHP 튜토리얼

위 내용은 PHP가 Redis 분산 잠금을 기반으로 높은 동시성과 반복 요청을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제