이 글은 Redis(코드 포함)에서 플래시 세일을 구현하는 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
소개: 플래시 세일에 대해 모두가 알아야 할 사항입니다. 단기간 내에 액세스 요청이 급증할 것입니다. 동시에 데이터가 과매도되지 않았는지, 아직 기술적인 부분이 있는지 확인해야 합니다. 도전. 안타깝게도 프로젝트에서 이를 구현할 기회가 없었습니다. 좀 더 많은 정보를 읽은 후 실험해 볼 계획입니다. 다음 코드는 테스트용이며 환경이 비교적 간단하므로 실제 상황에 따라 수정하십시오.
플래시 세일 대기열을 생성합니다
플래시 세일을 시작하기 전에 먼저 다음과 같이 제품을 대기열에 넣습니다
/** * 创建秒杀列表 */ public function createList() { $count = 30; $redisKey = 'goods_list'; for ($i = 1; $i = $count) { break; } Redis::rpush($redisKey, $i); } }
실행 후 Redis에서 확인합니다
제품 ID가 30개이며 데이터는 정상입니다. .
다음 단계는 Redis의 lpop
명령을 사용하여 Redis의 원자성을 활용하여 제품 ID를 얻는 핵심 단계입니다. lpop
命令获取商品 ID,利用的是 Redis 的原子性。
/** * 秒杀 */ public function buy() { // 随机用户名,无意义,仅做标记 $username = Hash::make(now()); if ($goodsId = Redis::lpop('goods_list')) { // 购买成功 Redis::hset('buy_success', $goodsId, $username); } else { // 购买失败 Redis::incr('buy_fail'); } }
如上,简化了代码,购买之后,成功与否只是做记录。实际应用中,当然会更加复杂,但要注意的是,不要同步操作 Mysql。多说一句,Hash:make(now())
即使值相同,也不会生成相同的数据,参考这里。
最后就是进行测试了,使用 ab 测试,执行 ab -c 300 -n 3000 http://localhost/buy/
,上述命令的意思是 300 并发,共请求 3000 次
执行完成,速度并不快,并且还有 794 个访问失败。来看下数据是否正确吧。在页面中打印 buy_success
rrreee
Hash:make(now())
는 값이 동일하더라도 동일한 데이터를 생성하지 않습니다. 여기를 참고하세요. Test
마지막 단계는 테스트하고, ab test를 사용하고, ab -c 300 -n 3000 http://localhost/buy/
를 실행하는 것입니다. 위 명령은 300개의 동시성을 의미하며 총 요청 3000개 시간
실행이 완료되었는데 속도가 그리 빠르지는 않고 여전히 794건의 접속실패가 발생하고 있습니다. 데이터가 맞는지 확인해 보겠습니다. 페이지에
buy_success
값
30명의 당첨자를 인쇄하세요. 실패한 플래시 판매 횟수를 살펴보겠습니다
정확한 숫자는 아닙니다. 2165+30은 실패한 요청 794개를 더하면 총 2989개로 여전히 3000개보다 적습니다.
🎜결론🎜🎜위 테스트에는 느린 응답 속도, 실패한 요청, 부정확한 실패 횟수 등의 단점이 있습니다. 코드 레이어뿐만 아니라 최적화할 곳이 많은 것 같습니다. 테스트 중에 데이터베이스에 대한 액세스 기록을 끄는 것을 잊어버렸는데, 이로 인해 약간의 영향이 있을 수 있습니다. 🎜좋은 점은 플래시 판매 성공 횟수가 정확하고 과매도가 아니라는 점입니다. [관련 권장 사항: 🎜Redis 튜토리얼🎜]🎜🎜🎜위 내용은 Redis의 플래시 세일 구현 방법 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!