Heim >Backend-Entwicklung >PHP-Problem >So implementieren Sie den Token-Bucket-Algorithmus mit PHP
PHP+Redis-Implementierung des Token-Bucket-Algorithmus-Codes:
<?phpnamespace Api\Lib;/** * 限流控制 */class RateLimit{ private $minNum = 60; //单个用户每分访问数 private $dayNum = 10000; //单个用户每天总的访问量 public function minLimit($uid) { $minNumKey = $uid . '_minNum'; $dayNumKey = $uid . '_dayNum'; $resMin = $this->getRedis($minNumKey, $this->minNum, 60); $resDay = $this->getRedis($minNumKey, $this->minNum, 86400); if (!$resMin['status'] || !$resDay['status']) { exit($resMin['msg'] . $resDay['msg']); } } public function getRedis($key, $initNum, $expire) { $nowtime = time(); $result = ['status' => true, 'msg' => '']; $redisObj = $this->di->get('redis'); $redis->watch($key); $limitVal = $redis->get($key); if ($limitVal) { $limitVal = json_decode($limitVal, true); $newNum = min($initNum, ($limitVal['num'] - 1) + (($initNum / $expire) * ($nowtime - $limitVal['time']))); if ($newNum > 0) { $redisVal = json_encode(['num' => $newNum, 'time' => time()]); } else { return ['status' => false, 'msg' => '当前时刻令牌消耗完!']; } } else { $redisVal = json_encode(['num' => $initNum, 'time' => time()]); } $redis->multi(); $redis->set($key, $redisVal); $rob_result = $redis->exec(); if (!$rob_result) { $result = ['status' => false, 'msg' => '访问频次过多!']; } return $result; }}
Codepunkte:
1. Definieren Sie zuerst die Regeln
Einzelne Regeln umfassen die Anzahl der Benutzerbesuche pro Minute ($minNum), die Gesamtzahl der Besuche pro Tag durch einen einzelnen Benutzer ($dayNum), die Gesamtzahl der Besuche der Schnittstelle usw.
2. Berechnungsrate
In diesem Codebeispiel werden Sekunden als Mindestzeiteinheit verwendet, Rate = Anzahl der Besuche/Zeit ($initNum / $expire)
3 Zeit Berechnungsmethode für die Anzahl der nach einem Besuch hinzugefügten Token
Ermitteln Sie die Zeit des letzten Besuchs, d. h. die Zeit, zu der der Token zuletzt eingezahlt wurde, multipliziert durch die Rate, die dieses Mal hinzugefügt werden muss. Beachten Sie, dass die Gesamtzahl der Token nach dem Auffüllen nicht größer sein darf als der Mindestwert der aufgefüllten Anzahl Die Nummer hat Vorrang.
4. Programmablauf
Anzahl der Token ($minNum) beim ersten Besuch initialisieren, in Redis speichern und den aktuellen Zeitstempel speichern, um die zu ergänzenden Token zu berechnen nächstes Mal Anzahl der Karten.
Erhalten Sie die verbleibende Anzahl an Token beim zweiten Besuch und fügen Sie die Anzahl an Token hinzu, die dieses Mal ergänzt werden sollen. Wenn die Anzahl der Token nach der Ergänzung > 0 ist, ist der aktuelle Besuch gültig und zugänglich Nach der Nutzung ist der Token nicht mehr zugänglich. Der Grund dafür, zuerst die Token aufzufüllen und dann zu beurteilen, ob die Token > 0 sind, liegt darin, dass es auch das Konzept der Rate gibt. Das heißt, wenn die verbleibenden Token beim letzten Mal 0 waren, aber die Token, die dieses Mal wieder aufgefüllt werden sollten, dann > 1 sind Sie können dieses Mal immer noch darauf zugreifen.
5. Parallelitätsverarbeitung
Verwenden Sie den optimistischen Sperrmechanismus von Redis.
Weitere Informationen zu diesem Thema finden Sie auf der chinesischen PHP-Website! !
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Token-Bucket-Algorithmus mit PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!