PHP+Redis 링크 높 은 상품 과 다 판매 문제 해결(실현 원리 및 절차)

전편글 은 Redis 사 무 를 이용 하여 높 은 동시 다발 상품 의 초과 판매 문 제 를 해결 하 는 것 에 대해 이 야 기 를 나 누 었 습 니 다.오늘 은 Redis 링크 를 사용 하여 높 은 동시 다발 상품 의 초과 판매 문 제 를 해결 하 는 것 에 대해 이 야 기 를 나 누 었 습 니 다.
실현 원리
redis 링크 를 사용 하여 합 니 다.pop 작업 은 원자 이기 때문에 많은 사용자 가 동시에 도착 하 더 라 도 순서대로 실행 하고 추천 합 니 다.
실현 절차
첫 번 째 단 계 는 먼저 상품 재 고 를 대열 에 넣 습 니 다.

/**
 *            
 * @param int $couponId    ID
 */
function addCoupons($couponId)
{
 //1.   Redis  
 $redis = new Redis();
 if (!$redis->connect('127.0.0.1', 6379)) {
 trigger_error('Redis    !!!', E_USER_ERROR);
 } else {
 echo '    <br>';
 }

 //     ID               
 //$sql = "select id, stock from coupon where id = {$couponId}";
 $stock = 10; //  10                          

 //      10          ID key redis   ,     ,      1,           
 for($i = 0; $i < $stock; $i++) {
 $redis->lPush("secKill:".$couponId.":stock", 1);
 }

 $redis->close();
}
$couponId = 11211;
addCoupons($couponId);
우 리 는 이 방법 을 호출 한 후에 redis 를 살 펴 보 았 다.링크 에 10 개의 요 소 를 추가 했다.

두 번 째 단계,사재 기 시작,재고 캐 시 주기 설정
이 단 계 는 자신의 업무 에 따라 정 해 집 니 다.만약 에 업무 규정 에 따라 이 쿠폰 은 2 분 동안 사용자 에 게 빼 앗 기 면expire()방법 으로 링크 에 유효기간 을 설정 합 니 다.유효기간 내 에 다 빼 앗 지 않 아 도 재고 가 있어 서 사용자 가 빼 앗 지 못 하 게 합 니 다.(우리 회사 의 업무 가 쿠폰 빼 앗 기 에 유효기간 을 설정 하지 않 기 때문에 이 단 계 는 할 필요 가 없습니다)

//           
$redis->expire('key', 120);
세 번 째 단 계 는 클 라 이언 트 가 순간 구 매 작업 을 수행 합 니 다.

/**
 *     (  )
 * @param int $couponId   ID
 * @param int $uid   ID
 * @return bool
 */
function secKill($couponId, $uid)
{
 //1.   Redis  
 $redis = new Redis();
 if (!$redis->connect('127.0.0.1', 6379)) {
 trigger_error('Redis    !!!', E_USER_ERROR);
 } else {
 echo '    <br>';
 }

 //                  ID key   (set) 
 //          ,              ,         
 if ($redis->sIsMember('secKill:'.$couponId.':uid', $uid)) {
 echo '    ';
 return false;
 }

 //       key
 $key = 'secKill:'.$couponId.':stock';

 //      ID key         ,    ,         
 $isSockNotEmpty = $redis->lPop($key);

 //    ,      0,    ,             ,      0,    
 if ($isSockNotEmpty != 1) {
 echo '     ';
 return false;
 }

 //    ,    ID UID      ,                   ,           
 $redis->lPush('couponOrder', $couponId.'+'.$uid);

 //              ,             
 $redis->sAdd('secKill:'.$couponId.':uid', $uid);
 $redis->close();
 return true;
}

$couponId = 11211;
$uid = mt_rand(1, 100);
secKill($couponId, $uid);
네 번 째 단 계 는 성공 적 으로 순식간에 죽 인 사용 자 를 데이터베이스 에 넣 어 지속 적 인 데 이 터 를 유지 합 니 다.병발 량 이 많 지 않 은 구 매 에 대해 저 희 는 세 번 째 구 매 에 성공 한 후에 정 보 를 데이터베이스 에 직접 기록 할 수 있 습 니 다.병발 량 이 비교적 많은 것 은 RabbitMQ 메시지 대기 열 에 넣 어서 소비 할 수 있 습 니 다.리 디 스 는 상대 적 으로 안정 적 이 고 신뢰 할 수 없다)

//      
//                    rabbitMQ       
현재 우 리 는 ab 도 구 를 사용 하여 높 고 발 급 된 쿠폰 강탈 행 위 를 모 의 합 니 다(2000 회 요청 수,100 병발 량).

ab -n 2000 -c 100 www.test.com/
그리고 저 희 는 Redis Desktop Manager 를 통 해 Redis 의 결 과 를 볼 수 있 습 니 다.
마찬가지 로 coupon Order 대기 열 에는 사용자 uid 와 쿠폰 id 를 포함 한 10 개의 정보 가 있 습 니 다.이 정 보 는 대기 열 에서 소비 할 수 있 습 니 다.

아울러 이용자 쿠폰 뺏 기 집합 에 도 이용자 10 명의 UID 정보 가 저장 됐다.

PHP+Redis 링크 가 높 은 가격 을 해결 하고 상품 의 초과 판매 문제(실현 원리 및 절차)를 해결 하 는 데 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 phop redis 가 높 은 가격 을 해결 하고 상품 의 초과 판매 내용 을 보 내 드 리 려 면 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기