PHP+Redis 트 랜 잭 션 으로 높 은 상품 과 다 판매 문제 해결(추천)

일부 사용자 수가 있 는 전자상거래 사이트 에 대해 서 는 단순히 관계 형 데이터 베이스(예 를 들 어 MySQL,Oracle)를 사용 하여 사재 기 를 한다 면 데이터 베이스 에 대한 부담 이 매우 크 고 데이터 베이스 의 잠 금 체 제 를 잘 사용 하지 않 으 면 상품,쿠폰 의 초과 판매 문 제 를 초래 할 수 있다.제 가 있 는 회사 도 똑 같은 문 제 를 만 났 습 니 다.문 제 는 쿠폰 이 초과 구 매 되 는 데 발생 했 습 니 다.문제 가 발생 한 후에 우 리 는 문 제 를 해결 할 방법 을 생각 하기 시 작 했 습 니 다.자신 이 redis 를 많이 사용 하기 때문에 저 는 redis 를 사용 하여 이 문 제 를 해결 하려 고 합 니 다.redis 의 고성능 과 사무 특성 을 이용 하여 온라인 쿠폰 이 재고 에 의 해 사재 기 되 는 문 제 를 해결 합 니 다.다음은 제 가 이 문 제 를 임시로 해결 하 는 1 판 위조 코드 를 제시 하고 세부 사항 을 제거 하 겠 습 니 다.

/**
 *     (  )
 * @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>';
 }

 //       key
 $key = 'secKill:'.$couponId.':stock';
 $redis->watch($key);

 //    
 $stock = $redis->get($key);

 //     ,     null
 if (!$stock && !is_numeric($stock)) {
 echo '     ';
 return false;
 }

 //    ,      0,    ,             ,      0,    
 if ($stock <= 0) {
 echo '     ';
 return false;
 }

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

 //      ,             ,     ,               
 //multi(),    redis  ,   multi-mode  ,    multi-mode  ,                  ,
 //  exec()     。
 $result = $redis->multi()->decr($key)->sAdd('secKill:'.$couponId.':uid', $uid)->exec();

 if (empty($result)) {//     
 echo '    ';
 return false;
 }

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

 $redis->close();
 return true;
}

$couponId = 11211;
$uid = mt_rand(1, 100);
secKill($couponId, $uid);
우선 쿠폰 ID 11211 인 쿠폰 재 고 를 10 개 로 모 의 설 치 했 습 니 다.

그리고 우 리 는 ab 도 구 를 사용 하여 1000 번 의 요청 을 모 의 하고 50 번 의 병발 량 으로 테스트 합 니 다.

ab -n 1000 -c 50 www.test.com/
그리고 저 희 는 Redis Desktop Manager 를 통 해 Redis 의 결 과 를 살 펴 보 겠 습 니 다.
coupon Order 대기 열 에 10 명의 사용자 정보 가 있 습 니 다.

그리고 쿠폰 의 남 은 수량 도 0 이 고 더 이상 마이너스 가 아 닙 니 다.

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

위의 이 코드 는 두 가지 문 제 를 해결 했다.
4.567917.순식간에 대량의 조회 가 데이터 베이스 에 큰 부담 을 주 는 문 제 를 해결 하고 유량 은 모두 redis 캐 시 층 에 차단 되 었 다쿠폰 재고 초과 사재 기 문제 해결
그러나 이 코드 에 도 문제 가 있 습 니 다.
  • redis 연결 탱크 를 사용 하지 않 고 새로운 redis 를 자주 만 드 는 것 은 일정한 성능 영향 을 미친다
  • 4.567917.사 무 를 사 용 했 기 때문에 매번 동시 다발 요청 에서 한 명의 사용자 만 쿠폰 을 빼 앗 는 데 성공 할 수 있 습 니 다.이 동시 다발 요청 중의 다른 사용 자 는 모두 실패 하고 두 번 째 동시 다발 만 기다 릴 수 있 습 니 다4.567917 역시 업무 로 인 한 재고 잔류 문제 이다.만약 에 10 개의 상품 이 있 으 면 1000 번 의 요 구 는 매번 200 번 의 동시 다발 량 이 고 5 번 의 동시 다발 요 구 는 1000 번 의 요 구 를 완 성 했 지만 5 명의 사용자 만 성공 적 으로 빼 앗 을 수 있다.만약 에 후속 적 인 요구 가 없 으 면 재고 가 5 개 더 있다알림:소비 대기 열 에서 쿠폰 발급 에 실패 하면 즉시 기록 하고 운영 관리자 에 게 문자 로 다시 보 내 거나 백 스테이지 수 동 으로 사용자 에 게 보 낼 수 있 는 지 확인 해 야 합 니 다.
    그래서 저 는 lua 스 크 립 트 와 redis 를 사용 하여 이 문 제 를 해결 하 였 습 니 다.구체 적 인 코드 는 제 가 나중에 정리 하고 완전 하 게 보충 하 겠 습 니 다.
    총결산
    PHP+Redis 사 무 를 통 해 높 은 가격 을 해결 하고 상품 의 초과 판매 문 제 를 해결 하 는 글 을 소개 합 니 다.더 많은 관련 php redis 가 높 은 가격 을 해결 하고 상품 의 초과 판매 내용 을 보 내 드 리 겠 습 니 다.저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저희 에 게 많은 사랑 을 주 셨 으 면 좋 겠 습 니 다!

    좋은 웹페이지 즐겨찾기