レートリミッタの仕組みを理解しようとしていました。ロックなしでJavaとRedisを使用するレートリミッタ
問題文は次のとおりです。IPアドレスあたり毎秒10の要求
SOLN:私はブログで見ることができるは次のとおりです。今、私は削除古いキーに無視していますのよう
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();
}
}
。 これがどのように機能するのか理解できません。 上記の私のコードによれば、1秒でマルチスレッド環境で10以上のAPI呼び出しを行うことになります。これは、redisClient.get(キー)をcallApi()コードに同期化することによってのみ解決できます。
私は
https://redis.io/commands/incrからこのコードを取ってきました。
上記のコードを変更することで、誰でも私がこれらのシナリオでredisを使用する正しい方法を理解するのを手伝ってもらえますか?
現在9第二の要求は5つの新しい要求が来served.now並行している中で、これらの5つのスレッドのいずれかが、スレッドごとに「他」block.Soを実行する前に、すべてのこれらの新しいスレッドが(キー)redisClient.getを呼び出すと仮定カウントは9になります。そうでない場合はブロックが実行され、incrが5回呼び出され、スレッドごとにapiが呼び出されます。
上記で提供したコード(EXPIREはありません)は、1ミリ秒で 'callApi()'呼び出しを10個に制限します。あなたの質問は何ですか? –
私は更新された質問があります。 – Nishat