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
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)
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
- 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);
}}
Nach dem Login kopieren
- 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)
// 抢购成功
Nach dem Login kopieren
-
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!