Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der Implementierung und Anwendung der PHP-Nachrichtenwarteschlange (mit Flussdiagramm)

Detaillierte Erläuterung der Implementierung und Anwendung der PHP-Nachrichtenwarteschlange (mit Flussdiagramm)

藏色散人
藏色散人nach vorne
2022-10-27 16:00:095336Durchsuche

Das Konzept, das Prinzip und die Implementierung der Nachrichtenwarteschlange.

Konzept Das grundlegende Flussdiagramm lautet wie folgt: Prozess

  • Anwendungsszenarien: Redundanz: Entkopplung: Verkehrsspitzenglättung: Asynchrone Kommunikation:
Implementierung

MySQL: Zuverlässig, langsam

    redis: Schnelle, langsame Verarbeitung großer Nachrichtenpakete.

  • Nachrichtensystem: Zuverlässig, hochprofessionell mit einer Obergrenze der Verarbeitungskapazität Detaillierte Erläuterung der Implementierung und Anwendung der PHP-Nachrichtenwarteschlange (mit Flussdiagramm)
  • Daemon-Ansatz

Entkopplung (Bestell- und Liefersystem)
  • Architekturentwurf 1 Übernahme geplanter Aufgaben
Wenn Sie das Verteilungsverarbeitungssystem für die Verarbeitung verwenden, aktualisieren Sie die Status der Bestellung, die in der aktuellen Datenbank verarbeitet werden muss, auf 2 und setzen Sie den Status auf 1, nachdem die Verarbeitung abgeschlossen ist

Sie können angeben, wie viele Daten jedes Mal aktualisiert werden sollen
  • Verkehr Schärfung (Redis implementiert Flash-Verkäufe)

Verwenden Sie die Warteschlangendatenstruktur

    lpush/rpush, um die Daten in die Liste einzufügen
  • lpop/rpop, um die Daten aus der Liste zu entfernen und den entfernten Wert zu erhalten
  • ltrim reserviert Elemente im angegebenen Bereich
  • llen Ermitteln Sie die Länge der Liste.

lset Legen Sie den Wert der Liste nach Index fest.lindex Ermitteln Sie den Wert in der Liste anhand des Index.

    lrange Ermitteln Sie die Elemente des angegebenen Bereichs
  • Das Diagramm ist wie folgt


    Detaillierte Erläuterung der Implementierung und Anwendung der PHP-Nachrichtenwarteschlange (mit Flussdiagramm)

  • Der Codefluss ist wie folgt

  • Das Flash-Kill-Programm schreibt die Anforderung an redis(uid, time)

Überprüfen Sie ggf. die Länge des Redis-Listenspeichers Mehr als 10 werden direkt verworfen.

Lesen Sie die Redis-Daten durch eine Endlosschleife und speichern Sie sie in der Datenbank Zur Kontrolle können Sie zunächst Dateisperren oder verteilte Redis-Sperren verwenden. Nehmen Sie sie dann mit rpop heraus. Wenn Sie sie nicht erhalten, bedeutet dies, dass sie ausverkauft sind Idee und Pseudocode lauten wie folgt:
    // 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);
        }}
    • rabbitmq
    • Architektur und Prinzip
    • wobei P den Produzenten darstellt und
    •   // 先将商品放入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)
        // 抢购成功
  • Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Implementierung und Anwendung der PHP-Nachrichtenwarteschlange (mit Flussdiagramm). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen