요구 사항:
먼저 시스템 확인의 예를 들어 보겠습니다. (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 명령의 새 버전은 분산 잠금을 구현할 수 있으며, 동시에 구현할 수 있습니다. 그렇지 않은 경우 설정된 항목과 시간 초과 항목만 있는 경우 제거됩니다.
<?php $redis=new Redis(); $redis->connect("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 중국어 웹사이트의 기타 관련 기사를 참조하세요!