0Pricing
Lua Academy · レッスン

Luaによるレート制限

Redis Luaでスライディングウィンドウ方式のレートリミッターをアトミックに実装します。

「Luaによるレート制限」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

なぜレート制限にRedisを使うのですか

Redisはアトミックな操作、インメモリによる高速性、複数のアプリケーションサーバー間で共有できる状態を提供するため、分散レート制限に適しています。

単純な固定ウィンドウカウンター

INCRとEXPIREを使って、時間枠ごとにリクエストを数えます。

EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local count = redis.call('INCR', key)
if count == 1 then
  redis.call('EXPIRE', key, window)
end
if count > limit then
  return 0  -- rejected
end
return 1  -- allowed
" 1 rate:user:123 100 60

ソート済みセットによるスライディングウィンドウ

より正確なレートリミッターでは、タイムスタンプをキーにしたソート済みセットを使用します。古いエントリを削除し、現在のリクエストを追加して、セットのサイズを数えます。

EVAL "
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
redis.call('ZREMRANGEBYSCORE', key, 0, now - window * 1000)
redis.call('ZADD', key, now, now .. math.random())
redis.call('EXPIRE', key, window)
local count = redis.call('ZCARD', key)
if count > limit then return 0 end
return 1
" 1 slidingRate:user:123 1706000000000 60 100

トークンバケットアルゴリズム

トークンバケットを使うと、平均レートを維持しながら一時的なバーストを許容できます。時間の経過に応じてトークンを補充し、各リクエストでトークンを1つ消費します。

リーキーバケットアルゴリズム

リーキーバケットは厳密に一定のレートを適用します。リクエストはキュー(バケット)に入れられ、固定された排出レートで処理されます。容量を超えたリクエストは拒否されます。

ユーザー別およびIP別の制限

ユーザーID、APIキー、またはIPアドレスを使ってレートリミッターのキーを作成します:rate:{userId}、rate:{ip}、rate:{apiKey}。

段階的なレート制限

ユーザーのプラン(freeとproなど)に応じて異なる制限を適用します。適用する制限を選択する前に、ユーザーのプランを確認します。

EVAL "
local tier = redis.call('HGET', 'user:tier', ARGV[1])
local limit = tier == 'pro' and 10000 or 1000
-- ... rest of rate limit check
" 0 "userId123"

ヘッダーの返却

スクリプトから残りのリクエスト数とリセット時刻を返し、アプリケーションがHTTPレスポンスにX-RateLimitヘッダーを設定できるようにします。

return {allowed, limit - count, resetTime}

分散環境でのアトミック性の保証

レート制限のチェック全体が単一のEVALスクリプト内で行われるため、Redisクラスターを共有するすべてのアプリケーションサーバーインスタンス間でアトミックに実行されます。

Redisクラスターに関する注意

Redis Clusterモードでは、スクリプトで使用するすべてのKEYSが同じスロットにハッシュされる必要があります。ハッシュタグを使用します:rate:{user123}:requestsで同じ場所に配置できます。

レート制限の監視

拒否したリクエストをユーザー/IP情報とともにログに記録します。拒否率が急増したときにアラートを設定します(攻撃または設定ミスを示します)。

レート制限に関する質問

レート制限において、Redis Luaスクリプトがアプリケーション側のカウンターより優れているのはなぜですか?

復習:Luaによるレート制限

Redis Luaで、INCR+EXPIRE(固定ウィンドウ)またはソート済みセット(スライディングウィンドウ)を使ったレートリミッターを実装します。アトミックなスクリプトにより、分散したアプリケーションサーバー間でも正しさが保証されます。HTTPヘッダー用に残りのクォータを返します。

よくある質問

「Luaによるレート制限」レッスンは無料ですか?

はい。「Luaによるレート制限」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「Luaによるレート制限」で何を学びますか?

Redis Luaでスライディングウィンドウ方式のレートリミッターをアトミックに実装します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Luaによるレート制限」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. EVALとRedis Lua環境
  2. アトミック操作とトランザクション
  3. Luaによるレート制限
  4. SCRIPT LOADとEVALSHA
← Lua Academyに戻る