Reka bentuk seni bina 1 menggunakan tugas berjadual
Apabila menggunakan sistem pemprosesan pengedaran, kemas kini status pesanan yang perlu diproses dalam pangkalan data semasa kepada 2. Selepas pemprosesan selesai, tetapkan status kepada 1
Anda boleh nyatakan bilangan data yang perlu dikemas kini setiap kali
Gunakan baris gilir Struktur data
ditunjukkan di bawah
Aliran kod adalah seperti berikut
Program bunuh kilat menulis permintaan untuk redis(uid, masa)
Semak panjang senarai redis, jika melebihi 10, ia akan dibuang terus
Baca data redis melalui gelung tak terhingga dan simpan dalam pangkalan data
// Spike.php 秒杀程序if(Redis::llen('lottery') <pre class="brush:php;toolbar:false">// Warehousing.php 入库程序while(true){ $user = Redis::rpop('lottery'); if (!$user || $user == 'nil') { sleep(2); continue; } $user_arr = explode($user, '%'); $insert_user = [ 'uid' => $user_arr[0], 'time' => $user_arr[1] ]; $res = DB::table('lottery_queue')->insert($insert_user); if (!$res) { Redis::lpush('lottery', $user); }}
Jika konkurensi terlalu besar dalam kod di atas, akan berlaku terlebih jual Dalam kes ini, anda boleh menggunakan kunci fail atau kunci yang diedarkan semula untuk kawalan Mula-mula masukkan produk ke dalam senarai redis dan gunakan rpop untuk mengambilnya Jika anda tidak dapat mendapatkannya, bermakna ia telah habis dijual
Idea dan pseudokod khusus adalah seperti berikut
// 先将商品放入redis中 $goods_id = 2; $sql = select id,num from goods where id = $goods_id; $res = DB::select($sql); if (!empty($res)) { // 也可以指定多少件 Redis::del('lottery_goods' . $goods_id); for($i=0;$i<pre class="brush:php;toolbar:false"> // 开始秒杀 $count = Redis::rpop('lottery_goods' . $goods_id); if (!$count) { // 商品已抢完 ... } // 用户抢购队列 $user_list = 'user_goods_id_' . $goods_id; $user_status = Redis::sismember($user_list, $user_id); if ($user_status) { // 已抢过 ... } // 将抢到的放到列表中 Redis::sadd($user_list, $uid); $msg = '用户:' . $uid . '顺序' . $count; Log::info($msg); // 生成订单等 ... // 减库存 $sql = update goods set num = num -1 where id = $goods_id and num > 0; // 防止超卖 DB::update($sql) // 抢购成功
Seni Bina dan Prinsip
Di mana P mewakili pengeluar, 🎜>
Atas ialah kandungan terperinci Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!