2017-05-15 13 views
1

Rediを使用して残りのAPIでレート制限を行いたいだけです。あなたは私に示唆してください、redisのどのデータ構造が適切かもしれません。私はちょうどキーと値を更新した後、要素を期限切れにすることはできませんRedisTemplateを使用しました。Java Redisレート制限

答えて

1

一般的な「ops /秒」の制限から、特定のユーザーが1日に行うことができる投稿の数など、より低い解像度で細かい制限まで、達成しようとしているものによっては複数のアプローチがあります。

私が気に入っている非常にシンプルでエレガントなアプローチは、有効期限が切れるカウンターです。この手法は簡単で、INCRがキーの有効期限を赤字で変更しないという事実を利用しています。つまり、基本的に1秒間に1,000リクエストをリソースに入れたいのであれば、(INCRを実行することによって)数字1のキーを作成し、それを1秒で期限切れにします。次に、各要求に対して、それが1000に達したかどうかをチェックし、増加していない場合はそれをインクリメントします。それがある場合 - 要求をブロックします。時間枠が経過すると、キーは自動的に期限切れとなり、次の要求時に再作成されます。擬似コードの観点から

は、アルゴリズムは次のとおり

def limit(resource_key): 

    current = GET(resource_key) 
    if current != NULL and current >= 1000: 
     return ERROR 
    else: 
     value = INCR(resource_key) 
     IF value == 1: 
      EXPIRE(value,1) 

     return OK