Detaillierte Erläuterung der auf Redis basierenden Listentyp-Datenstruktur von PHP zur Implementierung der IP-Strombegrenzungsoperation

藏色散人
Freigeben: 2023-04-09 18:22:01
nach vorne
3284 Leute haben es durchsucht

Empfohlen: „PHP-Video-Tutorial

Wenn Sie in der täglichen Geschäftsfunktionsentwicklung jede IP darauf beschränken möchten, in einem bestimmten Zeitraum nur eine bestimmte Anzahl von Malen auf eine bestimmte Schnittstelle zuzugreifen, wie müssen Sie das tun? umsetzen?
Diese Funktionsanforderung wird normalerweise verwendet, um zu verhindern, dass Skripte böswillig Schnittstellen löschen. Derzeit gibt es im Internet viele relativ vollständige aktuelle Begrenzungslösungen. Für allgemeine Websites können Sie die verknüpfte Listendatenstruktur von Redis verwenden, um die IP-Strombegrenzungsfunktion zu implementieren.
Zum Beispiel:
Angenommen, wir müssen für Schnittstelle A eine beliebige IP-Adresse so begrenzen, dass in jeweils 5 aufeinanderfolgenden Sekunden bis zu 3 Zugriffe möglich sind, und bei mehr als 3 Zugriffen einen Fehler zurückgeben.
Detaillierte Erläuterung der auf Redis basierenden Listentyp-Datenstruktur von PHP zur Implementierung der IP-Strombegrenzungsoperation
Für das obige Bild wurden bei 08 Sekunden in den letzten 5 Sekunden 4 Anfragen initiiert, wodurch die maximale Anzahl erreicht wurde, sodass der Zugriff zu diesem Zeitpunkt eingeschränkt ist.
Wenn in PHP implementiert, lautet der spezifische Logikcode wie folgt:

/**
* 检查队列的长度是否到达设定的阈值,已到达则返回false,未到达则将当前时间戳推入队列最末端,同时刷新队列整体的缓存时间
* @param $key 队列缓存的key
* @param $expire 队列缓存过期时间,例如上面例子中的5秒
* @param $limit 队列长度阈值,如上面例子中的3次
* @return bool
*/public function checkLimit($key, $expire, $limit){
    $length = $this->refreshList($key, $expire);
    if ($length rPush($key, time());
        $this->expire($key, intval($limit));
        return true;
    }
    return false;}/** 
* 刷新队列,过滤掉已经不在有效时间内的值,返回最新队列的长度
* @param $key string 自定义的缓存key
* @param $expire 队列缓存过期时间,例如上面例子中的5秒
* @return bool|int
*/public function refreshList ($key, $expire)   
 {
        if ($this->has($key)) {
            do { // 对于已存在数据的list,要先从前往后把已经过期的数据弹出
                $oldest_value = $this->lPop($key);
            } while ($oldest_value && time() - $oldest_value > $expire);
            // 把最后弹出的数据重新塞回list的最前边
            $oldest_value && $this->lPush($key, $oldest_value);
            return $this->lLen($key);
        }
        return 0;}
Nach dem Login kopieren

Die darin verwendeten Methoden lPop, lPush, lLen, rPush sind alle Methoden zum Betreiben verknüpfter Listendatenstrukturen nach der Kapselung der Redis-Erweiterung Die Rückgabewerte stimmen mit der nativen Methode überein.
Nachdem ich später online nachgeschaut habe, habe ich herausgefunden, dass Redis dieses Szenario direkter mit geordneten Sätzen wie zset umsetzt. Die Logik ist im Grunde dieselbe, nämlich den aktuellen Zeitstempel zu speichern und dann den Schieberegler zu verwenden Idee des Fensteralgorithmus: Bestimmen Sie, ob die Wertlänge im aktuellen Fenster den Grenzwert überschritten hat.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der auf Redis basierenden Listentyp-Datenstruktur von PHP zur Implementierung der IP-Strombegrenzungsoperation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!