Dalam artikel sebelum ini "Bagaimana untuk mengelakkan inventori produk terlebih jual di bawah konkurensi tinggi dalam PHP ", kami membincangkan isu berkaitan tentang mencegah inventori produk terlebih jual di bawah konkurensi tinggi Mari kita bincangkan bersama-sama Mari kita lihat pada kandungan berkaitan ujian konkurensi untuk mengelakkan inventori terlebih jual saya harap ia akan membantu semua orang.
Artikel ini berdasarkan kes ujian "Cara Mencegah Inventori Produk Terlebih Jual di bawah PHP High Concurrency". Pembelajaran yang disyorkan: "Tutorial Pembelajaran PHP"
Semasa ujian serentak, id jadual produk =1 nama = Kedai Beras Daohuaxiang = 15<.>
请求总数30 每次10个并发 ab -n 30 -c 10 http://xxxxx.top/code/the_limit/add_order.php
Hasil: (nombor inventori negatif adalah salah dan tidak dibenarkan) )
2. Mod tidak ditandatangani Laraskan kembali ke id jadual produk =1 nama = Kedai Beras Daohuaxiang = 15 Keputusan:请求总数30 每次10个并发 ab -n 30 -c 10 http://xxxxx.top/code/the_limit/unsigned.php
Terdapat 15 kali inventori berjaya dikurangkan, dan inventori kedai menunjukkan nombor negatif -6 9 kali dinilai bahawa inventori itu tidak cukup (nombor inventori negatif tidak betul dan tidak dibenarkan)
Hanya tambah untuk kemas kini pada pernyataan pertanyaan Kesan penguncian tidak bagus 3 transaksi MySQL, mengunci baris operasi Laraskan kembali ke id jadual produk =1 nama = Kedai beras Daohuaxiang = 15Keputusan:
请求总数30 每次10个并发 ab -n 30 -c 10 http://xxxxx.top/code/the_limit/ACID.php
Terdapat 15 pengurangan inventori yang berjaya dalam kedai. Kedai tidak mempunyai inventori negatif 15 kali dinilai bahawa inventori tidak mencukupi (nombor inventori negatif tidak betul dan tidak dibenarkan)
Tambah transaksi Kesannya bagus, ab -n 3000 -c 1000 tin mengendalikan concurrency 4. Kunci eksklusif fail tidak menyekat Borang sekatan<?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
Atas ialah kandungan terperinci Ujian konkurensi tinggi PHP: Kajian kes tentang mencegah inventori terlebih jual. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!