So geben Sie Inventar und andere Informationen zurück, wenn die Bestellung nicht innerhalb von 24 Stunden bezahlt wird – Redis-Ansatz

Im Allgemeinen denken wir daran, ein Timing-Skript auszuführen, um die entsprechende Verarbeitung durchzuführen. Diese Idee ist richtig. Verwenden Sie auf jeden Fall ein zeitgesteuertes Skript.

Methode 1: Ohne andere Technologien auszuleihen, werden unbezahlte Bestellungen abgefragt. Die Durchlaufmethode besteht darin, Inventar, Gutscheine usw. wiederherzustellen.

$order = Order::where(['is_pay'=>0])->where('addtime','<=',time()-86400)->selete();
foreach($order as $val){
    //处理相关的代码
}

Methode 2: Nutzen Sie die Vorteile von Redis, um zunächst die entsprechende Reihenfolge zu finden und auszuführen

Idee: Im Allgemeinen werden beim Aufgeben einer Bestellung der Lagerbestand und andere Informationen abgezogen. An dem Ort, an dem die Bestellung aufgegeben wird, stellen wir die Kombination aus Bestell-ID und Add-Time in die Redis-Warteschlange. Wenn wir die Warteschlange lesen, teilt die Liste die Bestellung auf Zeit und der aktuelle Zeitvergleich, wenn er 24 Stunden überschreitet, führen Sie die entsprechende Reihenfolge aus.

Geben Sie eine Bestellung auf und schreiben Sie den Warteschlangencode

//假设订单id = 29 addtime = 1298482849
$order_id = 29;
$addtime = 129848284;
$redis = new Redis();
$redis->lpush('order_list',$addtime.'-'.$order_id);

 Teilcode des Timing-Skripts

$redis = new Redis();
$key = 'order_list';
$len = $rediss->llen($key);
for ($i = 1; $i<=$len;$i++){
  $vaule = $rediss->Rpop($key);
  list($addtime,$order_id) = explode('-',$vaule);
  if($addtime <=  time() - 86400){
    //处理相关代码
      $order = Order::where(['id'=>$order_id,'is_pay'=>0,'is_send' => 0])->find();
    }else{
        //把值存放回去
        $rediss->rpush($key,$vaule);
        break;//按照时间放进去,碰到一个不符合的,证明后面进来的订单就是没超过24小时的。就没必要再循环下去了
    }
}

Hinweis: Wenn der Benutzer nach einigen Minuten bezahlt, sollten wir die Daten in der entsprechenden Warteschlange löschen.

Dies ist der LREN-Befehl mit Redis, der normalerweise im Zahlungserfolgsrückruf ausgeführt wird.

Teil des Codes

$order = Order::where(['order_no'=> $order_no])->find();//
$redis = new Redis();
$key = 'order_list';
$redis->lrem($key,$order->addtime.'-'.$order->id);//这样就能删除队列对应的值

Unterschied: Bei vielen Bestellungen verbraucht die erste Methode mehr Ressourcen und die Abfragegeschwindigkeit ist langsamer. Die zweite besteht darin, die Vorteile von Reids zu nutzen, um eine schnelle Ausführung zu ermöglichen und den Overhead von MySQL zu sparen. Allerdings gibt es auch einen Nachteil in der Menge des benötigten Redis-Speicherplatzes.
Die oben genannten Lösungen können individuell betrachtet und geschäftsspezifisch gestaltet werden.

Guess you like

Origin blog.csdn.net/qq_34861341/article/details/127646600