PHP+Redis 트 랜 잭 션 으로 높 은 상품 과 다 판매 문제 해결(추천)
4068 단어 phpredis사무.높 은 병발상품 이 초과 판매 되다.
/**
* ( )
* @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 캐 시 층 에 차단 되 었 다쿠폰 재고 초과 사재 기 문제 해결
그러나 이 코드 에 도 문제 가 있 습 니 다.
그래서 저 는 lua 스 크 립 트 와 redis 를 사용 하여 이 문 제 를 해결 하 였 습 니 다.구체 적 인 코드 는 제 가 나중에 정리 하고 완전 하 게 보충 하 겠 습 니 다.
총결산
PHP+Redis 사 무 를 통 해 높 은 가격 을 해결 하고 상품 의 초과 판매 문 제 를 해결 하 는 글 을 소개 합 니 다.더 많은 관련 php 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에 따라 라이센스가 부여됩니다.