boolean trueboolean trueboolean trueboolean trueboolean trueboolean falseboolean falseboolean falseint 5boolean trueboolean trueboolean trueboolean trueboolean trueboolean false



Erklären Sie den relevanten Inhalt von PHP mithilfe des Token-Bucket-Algorithmus, um eine Verkehrssteuerung basierend auf Redis zu implementieren
Dieser Artikel stellt PHP basierend auf Redis vor und verwendet den Token-Bucket-Algorithmus zur Steuerung des Zugriffsverkehrs. Er bietet eine vollständige Algorithmusbeschreibung und Demonstrationsbeispiele, die jeder lernen und verwenden kann.
Wenn lange Feiertage oder wichtige Feste im Inland stattfinden, sind die Aussichtspunkte oder U-Bahnen überfüllt, was zu einer übermäßigen Auslastung führt Die Anzahl der Personen im Bereich nimmt ab. Ab einem bestimmten Wert ist der Zutritt gestattet.
Zum Beispiel:
Die maximal zulässige Personenzahl in der Gegend beträgt M
Die aktuelle Personenzahl in der Gegend beträgt N
Jedes Mal, wenn eine Person eintritt, N+1, wenn N = M, ist der Zutritt nicht erlaubt
Jedes Mal, wenn eine Person geht, N-1, Wenn N < einen Augenblick, wodurch der Serverdruck sofort ansteigt und das System überlastet wird.
Natürlich können wir Server hinzufügen, um den Druck zu teilen. Erstens erfordert das Hinzufügen von Servern auch eine gewisse Zeit für die Konfiguration, und wenn Server aufgrund einer bestimmten Aktivität hinzugefügt werden, werden diese Serverressourcen verschwendet nach Beendigung der Aktivität.
Daher können wir zunächst die
Strombegrenzungsmethode verwenden, um den Serverdruck entsprechend der Art des Unternehmens zu reduzieren. Anders als bei der Verkehrsbeschränkung an malerischen Orten
ist die Zeit vom Besuch bis zum Ende des Systems sehr kurz, sodass wir nur die durchschnittliche Dauer jedes Besuchs kennen und das Maximum festlegen müssen Anzahl der gleichzeitigen Besucher. Token-Bucket-Algorithmus
1. Zuerst gibt es einen Token-Bucket, in dem Token gespeichert werden. Zu Beginn sind die Token im Token-Bucket voll (die Anzahl der Token). im Bucket Die Menge kann entsprechend den Serverbedingungen eingestellt werden.
2. Nehmen Sie für jeden Besuch einen Token aus dem Bucket. Wenn der Token im Bucket 0 ist, sind keine weiteren Besuche erlaubt.
3. Fügen Sie von Zeit zu Zeit Token hinzu, bis der Eimer voll ist. (Sie können in regelmäßigen Abständen mehrere Token einlegen oder den Token-Bucket entsprechend der tatsächlichen Situation direkt auffüllen)
Wir können die Warteschlange von
redis als Token-Bucket-Container verwenden lPush (in die Warteschlange stellen), rPop (aus der Warteschlange entfernen) um Token-Hinzufügungs- und -Verbrauchsvorgänge zu implementieren. >Ausgabe:
<?php/** * PHP基于Redis使用令牌桶算法实现流量控制 * Date: 2018-02-23 * Author: fdipzone * Version: 1.0 * * Descripton: * php基于Redis使用令牌桶算法实现流量控制,使用redis的队列作为令牌桶容器,入队(lPush)出队(rPop)作为令牌的加入与消耗操作。 * * Func: * public add 加入令牌 * public get 获取令牌 * public reset 重设令牌桶 * private connect 创建redis连接 */class TrafficShaper{ // class start private $_config; // redis设定 private $_redis; // redis对象 private $_queue; // 令牌桶 private $_max; // 最大令牌数 /** * 初始化 * @param Array $config redis连接设定 */ public function __construct($config, $queue, $max){ $this->_config = $config; $this->_queue = $queue; $this->_max = $max; $this->_redis = $this->connect(); } /** * 加入令牌 * @param Int $num 加入的令牌数量 * @return Int 加入的数量 */ public function add($num=0){ // 当前剩余令牌数 $curnum = intval($this->_redis->lSize($this->_queue)); // 最大令牌数 $maxnum = intval($this->_max); // 计算最大可加入的令牌数量,不能超过最大令牌数 $num = $maxnum>=$curnum+$num? $num : $maxnum-$curnum; // 加入令牌 if($num>0){ $token = array_fill(0, $num, 1); $this->_redis->lPush($this->_queue, ...$token); return $num; } return 0; } /** * 获取令牌 * @return Boolean */ public function get(){ return $this->_redis->rPop($this->_queue)? true : false; } /** * 重设令牌桶,填满令牌 */ public function reset(){ $this->_redis->delete($this->_queue); $this->add($this->_max); } /** * 创建redis连接 * @return Link */ private function connect(){ try{ $redis = new Redis(); $redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']); if(empty($this->_config['auth'])){ $redis->auth($this->_config['auth']); } $redis->select($this->_config['index']); }catch(RedisException $e){ throw new Exception($e->getMessage()); return false; } return $redis; } } // class end?>
Token regelmäßig beitreten, wir können Crontab verwenden, um es zu implementieren, Aufruf jede Minute Die Add-Methode fügt mehrere Token hinzu. Informationen zur Verwendung von Crontab finden Sie unter: „Befehlsformat für geplante Aufgabenausführung unter Linux und detaillierte Beispiele“ Das Mindestausführungsintervall von Crontab beträgt 1 Minute, wenn die Token im Token-Bucket verbraucht wurden In den ersten paar Sekunden kann das Token dann nicht mehr abgerufen werden, was dazu führt, dass der Benutzer lange warten muss. Wir können den Algorithmus zum Hinzufügen von Token optimieren und alle paar Sekunden innerhalb einer Minute mehrere Token hinzufügen. Dadurch kann sichergestellt werden, dass jedes Mal innerhalb einer Minute eine Chance besteht, Token zu erhalten.
Das von crontab aufgerufene Programm zum Hinzufügen von Token sieht wie folgt aus und fügt automatisch 3 Token pro Sekunde hinzu.
<?php/** * 演示令牌加入与消耗 */require 'TrafficShaper.class.php';// redis连接设定$config = array( 'host' => 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => NULL, 'retry_interval' => 100, );// 令牌桶容器$queue = 'mycontainer';// 最大令牌数$max = 5;// 创建TrafficShaper对象$oTrafficShaper = new TrafficShaper($config, $queue, $max);// 重设令牌桶,填满令牌$oTrafficShaper->reset();// 循环获取令牌,令牌桶内只有5个令牌,因此最后3次获取失败for($i=0; $i<8; $i++){ var_dump($oTrafficShaper->get()); }// 加入10个令牌,最大令牌为5,因此只能加入5个$add_num = $oTrafficShaper->add(10); var_dump($add_num);// 循环获取令牌,令牌桶内只有5个令牌,因此最后1次获取失败for($i=0; $i<6; $i++){ var_dump($oTrafficShaper->get()); }?>
Das Simulationsverbrauchsverfahren ist wie folgt und verbraucht 2-8 Token pro Sekunde.
boolean trueboolean trueboolean trueboolean trueboolean trueboolean falseboolean falseboolean falseint 5boolean trueboolean trueboolean trueboolean trueboolean trueboolean false
Nach dem Login kopieren
boolean trueboolean trueboolean trueboolean trueboolean trueboolean falseboolean falseboolean falseint 5boolean trueboolean trueboolean trueboolean trueboolean trueboolean false
Demo
Legen Sie eine geplante Aufgabe fest und führen Sie sie jede Minute aus<?php/** * 定时任务加入令牌 */require 'TrafficShaper.class.php';// redis连接设定$config = array( 'host' => 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => NULL, 'retry_interval' => 100, );// 令牌桶容器$queue = 'mycontainer';// 最大令牌数$max = 10;// 每次时间间隔加入的令牌数$token_num = 3;// 时间间隔,最好是能被60整除的数,保证覆盖每一分钟内所有的时间$time_step = 1;// 执行次数$exec_num = (int)(60/$time_step);// 创建TrafficShaper对象$oTrafficShaper = new TrafficShaper($config, $queue, $max);for($i=0; $i<$exec_num; $i++){ $add_num = $oTrafficShaper->add($token_num); echo '['.date('Y-m-d H:i:s').'] add token num:'.$add_num.PHP_EOL; sleep($time_step); }?>
Ausführungssimulationsverbrauch
<?php/** * 模拟用户访问消耗令牌,每段时间间隔消耗若干令牌 */require 'TrafficShaper.class.php';// redis连接设定$config = array( 'host' => 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => NULL, 'retry_interval' => 100, );// 令牌桶容器$queue = 'mycontainer';// 最大令牌数$max = 10;// 每次时间间隔随机消耗的令牌数量范围$consume_token_range = array(2, 8);// 时间间隔$time_step = 1;// 创建TrafficShaper对象$oTrafficShaper = new TrafficShaper($config, $queue, $max);// 重设令牌桶,填满令牌$oTrafficShaper->reset();// 执行令牌消耗while(true){ $consume_num = mt_rand($consume_token_range[0], $consume_token_range[1]); for($i=0; $i<$consume_num; $i++){ $status = $oTrafficShaper->get(); echo '['.date('Y-m-d H:i:s').'] consume token:'.($status? 'true' : 'false').PHP_EOL; } sleep($time_step); }?>
* * * * * php /程序的路径/cron_add.php >> /tmp/cron_add.log
In diesem Artikel wird der relevante Inhalt von PHP erläutert, der den Token-Bucket-Algorithmus verwendet, um eine Verkehrskontrolle basierend auf Redis zu implementieren. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website. Verwandte Empfehlungen:
So erstellen Sie eine QR-Code-Klasse mit Logo über PHP
Detaillierte Erläuterung der Neuerstellung und Beibehaltung von Tabellenpartitionen durch MySQL DatenmethodeErklärung dazu, dass PHP JSON_ENCODE keine privaten Objektattribute unterstützt
Das obige ist der detaillierte Inhalt vonErklären Sie den relevanten Inhalt von PHP mithilfe des Token-Bucket-Algorithmus, um eine Verkehrssteuerung basierend auf Redis zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Der Redis -Cluster -Modus bietet Redis -Instanzen durch Sharding, die Skalierbarkeit und Verfügbarkeit verbessert. Die Bauschritte sind wie folgt: Erstellen Sie ungerade Redis -Instanzen mit verschiedenen Ports; Erstellen Sie 3 Sentinel -Instanzen, Monitor -Redis -Instanzen und Failover; Konfigurieren von Sentinel -Konfigurationsdateien, Informationen zur Überwachung von Redis -Instanzinformationen und Failover -Einstellungen hinzufügen. Konfigurieren von Redis -Instanzkonfigurationsdateien, aktivieren Sie den Cluster -Modus und geben Sie den Cluster -Informationsdateipfad an. Erstellen Sie die Datei nodes.conf, die Informationen zu jeder Redis -Instanz enthält. Starten Sie den Cluster, führen Sie den Befehl erstellen aus, um einen Cluster zu erstellen und die Anzahl der Replikate anzugeben. Melden Sie sich im Cluster an, um den Befehl cluster info auszuführen, um den Clusterstatus zu überprüfen. machen

Die Zukunft von PHP wird erreicht, indem sich an neue Technologietrends angepasst und innovative Funktionen eingeführt werden: 1) Anpassung an Cloud Computing, Containerisierung und Microservice -Architekturen, Unterstützung von Docker und Kubernetes; 2) Einführung von JIT -Compilern und Aufzählungsarten zur Verbesserung der Leistung und der Datenverarbeitungseffizienz; 3) die Leistung kontinuierlich optimieren und Best Practices fördern.

So löschen Sie Redis -Daten: Verwenden Sie den Befehl Flushall, um alle Schlüsselwerte zu löschen. Verwenden Sie den Befehl flushdb, um den Schlüsselwert der aktuell ausgewählten Datenbank zu löschen. Verwenden Sie SELECT, um Datenbanken zu wechseln, und löschen Sie dann FlushDB, um mehrere Datenbanken zu löschen. Verwenden Sie den Befehl del, um einen bestimmten Schlüssel zu löschen. Verwenden Sie das Redis-Cli-Tool, um die Daten zu löschen.

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

PHP bleibt in der modernen Webentwicklung wichtig, insbesondere in Content-Management- und E-Commerce-Plattformen. 1) PHP hat ein reichhaltiges Ökosystem und eine starke Rahmenunterstützung wie Laravel und Symfony. 2) Die Leistungsoptimierung kann durch OPCACHE und NGINX erreicht werden. 3) Php8.0 führt den JIT -Compiler ein, um die Leistung zu verbessern. 4) Cloud-native Anwendungen werden über Docker und Kubernetes bereitgestellt, um die Flexibilität und Skalierbarkeit zu verbessern.

PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

Um eine Warteschlange aus Redis zu lesen, müssen Sie den Warteschlangenname erhalten, die Elemente mit dem Befehl LPOP lesen und die leere Warteschlange verarbeiten. Die spezifischen Schritte sind wie folgt: Holen Sie sich den Warteschlangenname: Nennen Sie ihn mit dem Präfix von "Warteschlange:" wie "Warteschlangen: My-Queue". Verwenden Sie den Befehl LPOP: Wischen Sie das Element aus dem Kopf der Warteschlange aus und geben Sie seinen Wert zurück, z. B. die LPOP-Warteschlange: my-queue. Verarbeitung leerer Warteschlangen: Wenn die Warteschlange leer ist, gibt LPOP NIL zurück, und Sie können überprüfen, ob die Warteschlange existiert, bevor Sie das Element lesen.

Die Gründe, warum PHP für viele Websites der bevorzugte Technologie -Stack ist, umfassen die Benutzerfreundlichkeit, die starke Unterstützung der Community und die weit verbreitete Verwendung. 1) Einfach zu erlernen und zu bedienen, geeignet für Anfänger. 2) eine riesige Entwicklergemeinschaft und eine reichhaltige Ressourcen haben. 3) in WordPress, Drupal und anderen Plattformen häufig verwendet. 4) Integrieren Sie eng in Webserver, um die Entwicklung der Entwicklung zu vereinfachen.
