Redisによるアクセス頻度の制限

951 ワード

Method 1
IP:rate.limiting:$IPをkeyで記録し、初期時設定期間は60秒であり、タイムアウトした場合は再設定し、そうでなければ判断し、1分以内に100回以上アクセスした場合はアクセスを禁止する.
$isKeyExists = rate.limiting:$IP
if ($isKeyExists == 1) {
  $times = INCR rate.limiting:$IP
  if ($times > 100){
    print '      '
    exit
  }
}else{
  MULTI
  INCR rating.limiting:$IP
  EXPIRE rating.limiting:$IP 60 
  EXEC
}

要求の頻度が毎秒10回,毎分9回であれば,問題のあるアクセスであっても制限できないことを考慮した.So
Method 2
$listLength = LLEN rate.limiting:$IP
if ($listLength < 10) {
  LPUSH rate.limiting:$IP now()
}else{
  $time = LINDEX rate.limiting:$IP, -1
  if (now() - $time < 60){
     print "      "
     exit
  }else{
     LPUSH rate.limiting:$IP now()
     LTRIM rate.limiting:$IP, 0, 9
  }
}

IPkeyのlist長、すなわちIPアクセスのタイムキューを計算し、10回未満であれば、アクセス毎の時間をスタックに入れる.そうでなければ、アクセス回数が10回未満の場合、現在の時間と最近のアクセス時間の時間差を計算し、60秒未満の場合、アクセスを禁止します.そうでなければ、キューをリセットし、アクセス時間を再格納します.