Heim >Datenbank >Redis >Kann Redis selbst den Stromfluss begrenzen?

Kann Redis selbst den Stromfluss begrenzen?

(*-*)浩
(*-*)浩Original
2019-11-22 10:08:402600Durchsuche

Kann Redis selbst den Stromfluss begrenzen?

Natürlich gibt es viele Möglichkeiten, die Strombegrenzung zu implementieren. Ich habe Redis verwendet, um drei Implementierungsmethoden zu üben, die auf relativ einfache Weise implementiert werden können. Redis kann nicht nur die Strombegrenzung durchführen, sondern auch Datenstatistiken, Personen in der Nähe und andere Funktionen durchführen.

Das erste: Setnx basierend auf Redis (Empfohlenes Lernen: Redis-Video-Tutorial )

Wir sind dabei Jeder weiß, dass die verteilte Sperre von Redis auf der SETNX-Anweisung beruht. Während des CAS-Vorgangs (Compare and Swap) wird die Ablaufzeit (expire) für den angegebenen Schlüssel festgelegt. Der Zweck besteht darin, nur N zuzulassen Anzahl der Zugriffsanfragen auf mein Codeprogramm innerhalb einer Zeiteinheit. Diese Funktion kann also leicht erreicht werden, indem man sich auf setnx verlässt.

Zum Beispiel

Wir müssen 20 Anfragen innerhalb von 10 Sekunden begrenzen, dann können wir die Ablaufzeit auf 10 setzen, wenn die Anzahl der angeforderten setnx 20 erreicht, wird der aktuelle Begrenzungseffekt erreicht.

Dieser Ansatz hat natürlich viele Nachteile. Wenn Sie beispielsweise 1-10 Sekunden zählen, ist es unmöglich, 2-11 Sekunden zu zählen , dann Wir müssen N-Schlüssel und andere Probleme in Redis behalten

Zweitens: Redis-basierte Datenstruktur zset

Tatsächlich ist die Hauptsache bei der Strombegrenzung Beim Schiebefenster wurde oben auch erwähnt, wie aus 1-10 2-11 wird. Tatsächlich sind sowohl der Startwert als auch der Endwert jeweils +1.


Und wenn wir die Listendatenstruktur von Redis verwenden, können wir diese Funktion einfach implementieren


Wir können die Anfrage in ein Zset-Array einbauen, wenn jede Anfrage eingeht Der Wert bleibt eindeutig und kann durch UUID generiert werden, und die Punktzahl kann durch den aktuellen Zeitstempel dargestellt werden, da die Punktzahl zur Berechnung der Anzahl der Anforderungen innerhalb des aktuellen Zeitstempels verwendet werden kann.

Die zset-Datenstruktur stellt auch die Range-Methode bereit, sodass wir leicht ermitteln können, wie viele Anfragen es innerhalb von 2 Zeitstempeln gibt


Der dritte Typ: basierend auf Redis Token Bucket Algorithmus

Wenn es um die Strombegrenzung geht, müssen wir den Token-Bucket-Algorithmus erwähnen. Der Token-Bucket-Algorithmus wird auch als Bucket-Algorithmus bezeichnet. Weitere Informationen finden Sie in der Erklärung zum Token-Bucket-Algorithmus.


Der Token-Bucket-Algorithmus erwähnt die Eingaberate und die Ausgaberate als die Eingangsrate, dann wird das Verkehrslimit überschritten.


Das heißt, jedes Mal, wenn wir auf eine Anfrage zugreifen, können wir ein Token von Redis erhalten. Wenn wir das Token erhalten, bedeutet dies, dass das Limit nicht überschritten wurde, und wenn wir es nicht erhalten können es, dann Das Ergebnis ist das Gegenteil.


Auf der Grundlage der oben genannten Ideen können wir die List-Datenstruktur von Redis kombinieren, um solchen Code einfach zu implementieren.


Verlassen Sie sich auf den LeftPop von List, um die zu erhalten Token

// 输出令牌
public Response limitFlow2(Long id){
        Object result = redisTemplate.opsForList().leftPop("limit_list");
        if(result == null){
            return Response.ok("当前令牌桶中无令牌");
        }
        return Response.ok(articleDescription2);
    }

Verlassen Sie sich auf die geplanten Aufgaben von Java, um das Token regelmäßig in die Liste zu verschieben. Natürlich muss das Token auch eindeutig sein, daher verwende ich hier immer noch die UUID, um es zu generieren

// 10S的速率往令牌桶中添加UUID,只为保证唯一性
    @Scheduled(fixedDelay = 10_000,initialDelay = 0)
    public void setIntervalTimeTask(){
        redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
    }

Zusammenfassung Es ist zunächst nicht schwierig, den Code für diese aktuellen Begrenzungsmethoden zu implementieren. Wir können den oben genannten Code in AOP oder Filter hinzufügen, um den aktuellen Fluss der Schnittstelle zu begrenzen und letztendlich Ihre Website zu schützen.

Weitere technische Artikel zum Thema Redis finden Sie in der Spalte

Einführung in das Redis-Datenbanknutzungs-Tutorial, um mehr zu erfahren!

Das obige ist der detaillierte Inhalt vonKann Redis selbst den Stromfluss begrenzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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