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

藏色散人
Lepaskan: 2023-04-11 08:22:02
ke hadapan
5301 orang telah melayarinya

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);
          }}
      Salin selepas log masuk
  • 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)
      // 抢购成功
    Salin selepas log masuk

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!

Label berkaitan:
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