Manchmal müssen wir die Häufigkeit des Zugriffs auf eine API oder Seite begrenzen, z. B. wie oft eine einzelne IP oder ein einzelner Benutzer in einer Minute zugreifen kann. Solche Anforderungen können mit Redis leicht implementiert werden.
Strategie 1:
Speichern Sie einen Zählwert (int) in Redis, der Schlüssel ist user:$ip und der Wert ist die Anzahl der Besuche an die IP. Beim erstmaligen Setzen des Schlüssels läuft der Satz ab.
Bevor Sie 1 zur Anzahl hinzufügen, stellen Sie fest, ob der Schlüssel vorhanden ist. Wenn er nicht vorhanden ist, gibt es zwei Situationen: 1. Auf die IP wurde nicht zugegriffen, aber auf den Schlüssel ist abgelaufen. Dann müssen Sie den Ablauf zu diesem Zeitpunkt erneut festlegen.
Wenn der Benutzer zugreift, stellen Sie fest, ob der Wert von count größer als die Obergrenze ist. Wenn er niedriger als die Obergrenze ist, verarbeiten Sie die Anforderung, andernfalls verweigern Sie die Verarbeitung der Anforderung.
Strategie 2:
Betrachten Sie diese Situation unter der Annahme, dass Benutzer innerhalb von 60 Sekunden nur 100 Mal zugreifen dürfen, wenn ein Benutzer in der 1. Sekunde, also in der 59. Sekunde, nur 1 Mal zugreift Bei 61 Sekunden wurde 99 Mal darauf zugegriffen, bei 61 Sekunden dann 100 Mal.
Bei der Behandlung gemäß Richtlinie 1 wurden zwischen der 1. und 60. Sekunde 100 Anfragen und in der 61. Sekunde 100 Anfragen empfangen, sodass die IP im Zeitraum 62–120 Anfragen nicht mehr verarbeitet wird.
Es scheint, dass es kein Problem gibt, aber wenn man genau darüber nachdenkt, wurden zwischen den Sekunden 59 und 61 99+100=199 Anfragen angenommen, und das Zeitintervall beträgt nur 3 Sekunden. In diesem Fall liegt ein Problem mit dem ursprünglichen Design vor.
Lösung: Sie können die Listendatenstruktur (bidirektionale Warteschlange) von Redis verwenden. Der Schlüssel lautet user:$ip, d. h. für jede IP wird eine bidirektionale Warteschlange eingerichtet Es wird folgendes Urteil gefällt:
1. Wenn die Anzahl der Elemente in der Liste weniger als 100 beträgt, wird der Zeitstempel Lpush beim Eintreffen der Anforderung zur Liste hinzugefügt.
2. Wenn die Liste mehr als 100 Elemente enthält, nehmen Sie Lindex(-1) heraus, das ist der Zeitstempel der frühesten Anfrage unter den 100 Anfragen Zeitstempel Wenn der Unterschied zum aktuellen Zeitstempel mehr als 60 Sekunden beträgt, bedeutet dies, dass die erste Anforderung abgelaufen ist und die erste Anforderung aus der Rpop-Warteschlange entfernt wird. Stellen Sie dann den aktuellen Zeitstempel in die Warteschlange von Lpush.
Weitere Redis-Kenntnisse finden Sie in der Spalte Redis-Einführungs-Tutorial.
Das obige ist der detaillierte Inhalt vonSo begrenzen Sie die Anzahl der IP-Zugriffe in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!