Rumah > pembangunan bahagian belakang > tutorial php > Ujian konkurensi tinggi PHP: Kajian kes tentang mencegah inventori terlebih jual

Ujian konkurensi tinggi PHP: Kajian kes tentang mencegah inventori terlebih jual

WBOY
Lepaskan: 2023-04-10 22:46:01
ke hadapan
7373 orang telah melayarinya

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.

Ujian konkurensi tinggi PHP: Kajian kes tentang mencegah inventori terlebih jual

Artikel ini berdasarkan kes ujian "Cara Mencegah Inventori Produk Terlebih Jual di bawah PHP High Concurrency". Pembelajaran yang disyorkan: "Tutorial Pembelajaran PHP"

1 Pesanan biasa

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
Salin selepas log masuk

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
Salin selepas log masuk

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 = 15

Keputusan:
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/ACID.php
Salin selepas log masuk

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
  • Borang tidak menyekat
  • Kesannya bukan negatif tetapi dari segi prestasi: Transaksi>Menyekat>Tidak menyekat
5 versi sebelumnya, versi kunci optimistik

Kesimpulan akhir: Utamakan cabaran serentak, redis mempunyai prestasi yang baik

Pembelajaran yang disyorkan: "
<?php
$redis =new Redis();
$redis->connect("127.0.0.1", 6379);
$redis->auth(&#39;PASSWORD&#39;);
$redis->watch(&#39;sales&#39;);//乐观锁 监视作用 set()  初始值0
$sales = $redis->get(&#39;sales&#39;);
//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[&#39;store&#39;];
// 库存
$n = 15;
if ($sales >= $n) {
    insertLog(&#39;库存为0 秒杀失败&#39;);
    exit(&#39;秒杀结束&#39;);
}

//redis开启事务
$redis->multi();
$redis->incr(&#39;sales&#39;); //将 key 中储存的数字值增一 ,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
$res = $redis->exec(); //成功1 失败0

if ($res) {
    //秒杀成功
    $con = new mysqli(&#39;localhost&#39;,&#39;root&#39;,&#39;PASSWORD&#39;,&#39;dev&#39;);
    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(&#39;恭喜 秒杀成功&#39;);
    }

} else {
    insertLog(&#39;抱歉 秒杀失败&#39;);
    exit(&#39;抢购失败&#39;);
}

function db()
{
    global $con;
    $con = new mysqli(&#39;localhost&#39;,&#39;root&#39;,&#39;WOrd1234.*&#39;,&#39;dev&#39;);
    if (!$con) {
        echo "数据库连接失败";
    }
}

/**
 * 记录日志
 */
function insertLog($content)
{
    global $con;
    $sql = "INSERT INTO `order_log` (content) values(&#39;$content&#39;)";
    mysqli_query($con, $sql);
}
Salin selepas log masuk
Tutorial video PHP
ab -n 30 -c 10 http://xxxxxx.top/code/the_limit/optimistic\ _redis_lock.php
Salin selepas log masuk

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!

Label berkaitan:
php
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan