Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir)

Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir)

藏色散人
藏色散人ke hadapan
2022-10-27 16:00:095292semak imbas

Konsep, prinsip dan pelaksanaan baris gilir mesej

Konsep

  • Perisian tengah untuk struktur baris gilir
  • Tidak perlu menggunakan mesej dengan segera
  • Digunakan mengikut urutan oleh pengguna atau pelanggan

Carta aliran asas adalah seperti berikut

  • Proses
    Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir)

Senario Aplikasi

  • Lewahan
  • Penyahgandingan
  • Pemotongan puncak trafik
  • Komunikasi tak segerak

Kaedah pelaksanaan

  • mysql: boleh dipercayai, perlahan
  • redis: cepat, lambat untuk memproses pakej mesej besar
  • Sistem mesej: boleh dipercayai dan profesional

Mekanisme pencetus mesej

  • Infinite kaedah gelung, tidak dapat pulih dalam masa sekiranya berlaku kegagalan
  • Tugas yang dijadualkan: penyamaan tekanan, tetapi terdapat had atas kapasiti pemprosesan
  • Kaedah proses Daemon

Penyahgandingan (sistem pesanan dan penghantaran)

  • Reka bentuk seni bina 1 menggunakan tugas berjadual
    Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir)

  • 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

Pengurangan trafik (redis melaksanakan jualan kilat)

  • Gunakan baris gilir Struktur data

    • lpush/rpush Masukkan data ke dalam senarai
    • lpop/rpop Alih keluar data daripada senarai dan dapatkan nilai yang dialih keluar
    • ltrim Kekalkan Elemen selang waktu yang ditentukan dalam
    • llen Dapatkan panjang senarai
    • lset Tetapkan nilai senarai mengikut indeks
    • lindex Dapatkan nilai dalam senarai mengikut indeks
    • lrange Dapatkan julat yang ditentukan Elemen
  • ditunjukkan di bawah
    Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir)

  • 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)
      // 抢购成功

rabbitmq

  • Seni Bina dan Prinsip
    Penjelasan terperinci tentang pelaksanaan dan aplikasi baris gilir mesej PHP (dengan carta alir)
    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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam