PHP+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 가 높 은 가격 을 해결 하고 상품 의 초과 판매 내용 을 보 내 드 리 려 면 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.