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 BeispielWir 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 behaltenZweitens: 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.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.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); }
// 10S的速率往令牌桶中添加UUID,只为保证唯一性 @Scheduled(fixedDelay = 10_000,initialDelay = 0) public void setIntervalTimeTask(){ redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString()); }
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!