이전 글 "PHP에서 높은 동시성으로 인한 상품 재고 과판매 방지 방법"에서 높은 동시성으로 인한 재고 과판매 방지에 대한 관련 내용을 동시 테스트에 대해 살펴보겠습니다. 모든 사람에게 도움이 되기를 바랍니다.
이 글은 "PHP의 높은 동시성에서 제품 재고가 과매출되는 것을 방지하는 방법" 테스트 사례를 기반으로 작성되었습니다. 추천 학습: "PHP 학습 튜토리얼"
동시 테스트 중 제품 테이블 ID =1 이름 = Daohuaxiang Rice store = 15
请求总数30 每次10个并发 ab -n 30 -c 10 http://xxxxx.top/code/the_limit/add_order.php
결과:
15개의 성공적인 재고 감소가 있었습니다. 매장재고는 -7 8번으로 재고부족으로 판단됩니다. (마이너스 재고번호는 부정확하여 허용되지 않습니다.)
다시 상품 테이블 ID = 1 이름 = 다오화샹쌀가게로 조정 = 15
请求总数30 每次10个并发 ab -n 30 -c 10 http://xxxxx.top/code/the_limit/unsigned.php
결과:
재고 감소가 15번 성공했습니다. 매장 재고가 -6으로 나타났습니다. 9번은 재고가 부족하다고 판단되었습니다(마이너스 재고 수치는 부정확하므로 허용되지 않습니다).
업데이트를 쿼리문에 추가하는 것만으로는 잠금 효과가 거의 없습니다.
제품 테이블 ID = 1 이름 = Daohuaxiang Rice store = 15
请求总数30 每次10个并发 ab -n 30 -c 10 http://xxxxx.top/code/the_limit/ACID.php
결과:
15번의 재고감축에 성공하였고, 매장재고가 마이너스 15로 나타나지 않았습니다. 재고가 부족한 것으로 판단됩니다(마이너스 재고번호는 부정확하여 허용되지 않습니다)
거래 추가 효과 ab -n 3000 -c 1000 동시성을 견딜 수도 있습니다
차단 형식
비차단 형식
효과는 부정적이지는 않지만 성능 측면에서는 트랜잭션 > 차단 > 비- 블로킹
코드는 이전 낙관적 잠금 버전에서 약간 조정되었습니다
<?php $redis =new Redis(); $redis->connect("127.0.0.1", 6379); $redis->auth('PASSWORD'); $redis->watch('sales');//乐观锁 监视作用 set() 初始值0 $sales = $redis->get('sales'); //var_dump($sales); exit; db(); global $con; // 查询商品信息 //$product_id = 1; //$sql = "select * from products where id={$product_id}"; //$result = mysqli_query($con, $sql); //$row = mysqli_fetch_assoc($result); //$store = $row['store']; // 库存 $n = 15; if ($sales >= $n) { insertLog('库存为0 秒杀失败'); exit('秒杀结束'); } //redis开启事务 $redis->multi(); $redis->incr('sales'); //将 key 中储存的数字值增一 ,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。 $res = $redis->exec(); //成功1 失败0 if ($res) { //秒杀成功 $con = new mysqli('localhost','root','PASSWORD','dev'); if (!$con) { echo "数据库连接失败"; } $product_id = 1;// 商品ID $buy_num = 1;// 购买数量 sleep(1); $sql = "update products set store=store-{$buy_num} where id={$product_id}"; if (mysqli_query($con, $sql)) { echo "秒杀完成"; insertLog('恭喜 秒杀成功'); } } else { insertLog('抱歉 秒杀失败'); exit('抢购失败'); } function db() { global $con; $con = new mysqli('localhost','root','WOrd1234.*','dev'); if (!$con) { echo "数据库连接失败"; } } /** * 记录日志 */ function insertLog($content) { global $con; $sql = "INSERT INTO `order_log` (content) values('$content')"; mysqli_query($con, $sql); }
ab -n 30 -c 10 http://xxxxxx.top/code/the_limit/optimistic\ _redis_lock.php
최종 결론 동시성 문제의 우선순위를 지정하고 redis의 성능이 좋습니다
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 PHP 높은 동시성 테스트: 재고 과판매 방지 사례 연구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!