Ich habe versucht zu verstehen, wie Rate-Begrenzer funktioniert.Rate Limiter mit Java und Redis ohne Sperre
Problemstellung ist: zehn Anfragen pro Sekunde pro IP-Adresse
Soln: i in Blogs sehen kann, ist:
public void makeApiCall(String ip){
Long currentTime=Timestamp timestamp = System.currentTimeMillis();
String key=ip+":"+currentTime;
Integer count=redisClient.get(key);
if(count!=null && count > 10){
throw LimitExceededException();
}
else{
redisClient.incr(key,1);
callApi();
}
}
Ab jetzt habe ich zu entfernten alten Schlüssel bin ignorieren. Ich kann nicht verstehen, wie diese Lösung funktionieren wird? Wie oben erwähnt wird Code mehr als 10 API-Aufruf in Multi-Thread-Umgebung mit in einer Sekunde. Es kann nur gelöst werden, indem man den Schlüssel redisClient.get (key) zum callApi() -Code synchronisiert.
Ich habe unter diesen Code aus
https://redis.io/commands/incr.
Kann mir jemand helfen zu verstehen (durch die Änderung des oben genannten Codes), was ist der richtige Weg, um redis in diesem Szenario zu verwenden?
in Angenommen aktuellen zweiten 9 Anfragen haben served.now gleichzeitig 5 neue Anfragen kommen, sind alle diese neuen Threads redisClient.get nennen (key), bevor jeder dieser 5 Threads ausführen „else“ block.So für jeden Thread count wird 9 und sonst Block wird ausgeführt und incr wird 5 mal mehr aufgerufen werden und für jeden Thread api wird aufgerufen werden.
Der oben angegebene Code (obwohl EXPIRE nicht vorhanden ist) beschränkt sich auf 10 CallApi() - Aufrufe in einer einzigen Millisekunde. Was ist deine Frage? –
Ich habe die Frage aktualisiert. – Nishat