はじめに
Web APIを運用していると、次のような課題に直面することがあります。
- 同一ユーザーからの過剰アクセス
- ボットやスクレイピング対策
- 外部APIの呼び出し回数制限
- 意図しない負荷による障害
これらを防ぐためによく使われる仕組みが レート制限(Rate Limiting) と呼ばれるものです。
今回はRedisを使ったレート制限の実装についてまとめてみます。
そもそもRedisとは
Redisはインメモリデータベースの一種になります。
通常のRDB(リレーショナルデータベース)とは異なりメモリ上でデータを管理します。
メモリ上でデータを管理するので、データに関する処理(保存・取得)が早いのが特徴となります。
またRedisはキー・バリューストア型のデータ構造をしています。

キーはデータにアクセスする際に参照するものであり、バリューは実際のデータになります。
こちらの記事は非常に分かりやすいので引用させていただきます!
Redisを使ったレート制限
シンプルなカウンターのデータを持つことで回数を制限することができます。
FUNCTION LIMIT_API_CALL(ip) // IPアドレスを引数に取る
ts = CURRENT_UNIX_TIME() // 現在の時間(秒)を取得
keyname = ip+":"+ts // IPアドレス+秒のKeyを作成
MULTI
INCR(keyname) // Keyがなければ新規作成。KeyがあればValueを1増やす
EXPIRE(keyname,10) // Keyの有効期限は10秒
EXEC
current = RESPONSE_OF_INCR_WITHIN_MULTI // 現在のValueの値を取得
IF current > 10 THEN // Valueが10超えている場合はエラー
ERROR "too many requests per second"
ELSE
PERFORM_API_CALL() // 処理を続行
END
終わりに
APIごとにレート制限を設けることで、DDoSのような攻撃による過剰な負荷発生リスクを抑えることできます!
他にも外部APIと連携が含まれるAPIなどは過剰なアクセスがあると、外部API側のレート制限に引っかかってしまう可能性もあるため、アプリ側にもレート制限を設けることが有効です!
最後まで読んでいただきありがとうございました!