Anforderungen:
Lassen Sie uns zunächst ein Beispiel für eine bestimmte Systemüberprüfung geben: (A-Kanalsystem, Business-B-System, externes Hersteller-C-System)
(1) Geschäftssystem B ruft Kanalsystem A auf, um zu überprüfen, ob das eingehende Mobiltelefon, der Personalausweis und der Name konsistent sind.
(2) Kanal A-System ruft dann externen Hersteller C-System auf.
(3) Das System von Kanal A gibt die Ergebnisse an das Geschäftssystem B zurück.
Von diesen drei Prozessen (2) erfordert der Anruf bei externen Anbietern eine Abrechnung.
Wenn die Parallelität von Geschäftssystem B sehr hoch ist, gibt es 100 gleiche Drei-Faktor-Verifizierungen. Da es sich um die gleichen drei Faktoren handelt, muss Kanal A den Hersteller nur einmal anrufen, um das Ergebnis zu erfahren. Um zu verhindern, dass andere Anfragen externe Systeme aufrufen, während eine bestimmte Anfrage noch nicht beantwortet wurde, ist zu diesem Zeitpunkt eine Sperre erforderlich
Eigenschaften verteilter Sperren
● Atomarität: Gleichzeitig kann nur ein Thread einer Maschine die Sperre erhalten
● Blockierbar: Bevor die Sperre erworben wird, können Sie nur blockieren und warten, bis die Sperre erhalten wird. ● Hohe Verfügbarkeit: Auch wenn ein Programmfehler oder ein Maschinenschaden auftritt, kann die Sperre dennoch erworben werden , wird freigegeben; ● Hohe Leistung: Der Erwerb und die Freigabe von Sperren sind kostengünstig. Zu erreichen: Sperren, Sperrreduzierung, SperrzeitüberschreitungDie Implementierungsmethode kann sein: Datenbank MC Redis Systemdatei ZookeeperIch bin jetzt ein Kanalsystem, wenn 100 sind Das Gleiche Die Geschäftsanfrage wird übergeben. Meine erste Anfrage muss zuerst gesperrt werden, und dann fordere ich das externe Anbietersystem an. Nachdem ich auf das Antwortergebnis gewartet habe, füge ich einen weiteren Schlüssel ein und lösche dann die Sperre. Andere Anfragen erhalten zunächst die untere Sperre. Wenn die Sperre bereits vorhanden ist, werden sie wiederum warten, wenn die Sperre nicht mehr vorhanden ist. Wenn die erste Anfrage fehlschlägt und das Ergebnis nicht eingefügt wird, fahren Sie mit der Erfassung der Sperre fort und fragen Sie das externe System ab. Sperre holen:$redis->set('lock:手机号&身份证&姓名', 1, ['nx', 'ex'=>10]);
<?php $redis=new Redis(); $redis->connect("127.0.0.1",6379); //高并发时防止重复请求 //渠道系统传递过来的key $lockKey='lock:18806767777&37781991111629092&taoshihan'; $resultKey='res:18806767777&37781991111629092&taoshihan'; //如果已经查询过值,可以直接返回 $info=$redis->get($resultKey); if($info){ exit($info); } //如果没有值的,获取锁 $lock=$redis->set($lockKey, 1, ['nx', 'ex'=>10]); if($lock){ //请求外部系统获取结果,比如响应结果比较慢 sleep(8); $info='{"name":"taoshihan"}'; $ret=$redis->set($resultKey,$info); if($ret){ //删除锁 $redis->del($lockKey); exit($info); } } echo "请稍后重试!";
Empfohlenes Lernen:
PHP-Tutorial
Das obige ist der detaillierte Inhalt vonWie PHP eine hohe Parallelität und wiederholte Anfragen basierend auf verteilten Redis-Sperren verhindert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!