0Pricing
Lua Academy · Leçon

Limitation du débit avec Lua

Implémentez de manière atomique des limiteurs de débit à fenêtre glissante dans Redis Lua.

Limitation du débit avec Lua est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.

Pourquoi Redis pour la limitation de débit ?

Redis fournit des opérations atomiques, une vitesse en mémoire et un état partagé entre plusieurs serveurs d'application, ce qui en fait un outil idéal pour la limitation de débit distribuée.

Compteur à fenêtre fixe simple

Comptez les requêtes par fenêtre temporelle avec INCR et 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

Fenêtre glissante avec des ensembles triés

Un limiteur de débit plus précis utilise un ensemble trié indexé par horodatage. Supprimez les anciennes entrées, ajoutez la requête actuelle, puis comptez le nombre d'éléments de l'ensemble.

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

Algorithme du seau de jetons

Un seau de jetons autorise les pointes tout en maintenant un débit moyen. Les jetons sont ajoutés au fil du temps ; chaque requête consomme un jeton.

Algorithme du seau percé

Le seau percé impose un débit constant strict. Les requêtes sont placées en file (le seau), puis traitées à un débit d'évacuation fixe. Les dépassements sont refusés.

Limites par utilisateur et par adresse IP

Indexez le limiteur de débit par identifiant utilisateur, clé d'API ou adresse IP : rate:{userId}, rate:{ip}, rate:{apiKey}.

Limites de débit par niveau

Appliquez des limites différentes selon le niveau de l'utilisateur (gratuit ou pro). Vérifiez le niveau de l'utilisateur avant de choisir la limite à appliquer.

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"

Renvoyer des en-têtes

Renvoyez depuis le script le nombre de requêtes restantes et l'heure de réinitialisation afin que l'application puisse définir les en-têtes X-RateLimit dans la réponse HTTP.

return {allowed, limit - count, resetTime}

Garantie atomique distribuée

Puisque l'intégralité de la vérification de la limite de débit se trouve dans un seul script EVAL, elle est atomique sur toutes les instances de serveur d'application qui partagent le cluster Redis.

Remarque sur le cluster Redis

En mode cluster Redis, toutes les clés KEYS utilisées dans un script doivent être hachées vers le même emplacement. Utilisez des balises de hachage : rate:{user123}:requests pour forcer la co-localisation.

Surveiller les limites de débit

Consignez les requêtes refusées avec les informations sur l'utilisateur et l'adresse IP. Configurez des alertes lorsque le taux de refus augmente fortement (ce qui indique une attaque ou une mauvaise configuration).

Question sur la limitation de débit

Pourquoi un script Lua Redis est-il plus efficace pour limiter le débit que des compteurs gérés par l'application ?

Récapitulatif : limitation de débit avec Lua

Implémentez les limiteurs de débit en Lua dans Redis avec INCR+EXPIRE (fenêtre fixe) ou des ensembles triés (fenêtre glissante). Le script atomique garantit la fiabilité entre les serveurs d'application distribués. Renvoyez le quota restant pour les en-têtes HTTP.

Questions Fréquemment Posées

La leçon « Limitation du débit avec Lua » est-elle gratuite ?

Oui — le texte complet de « Limitation du débit avec Lua » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Limitation du débit avec Lua » ?

Implémentez de manière atomique des limiteurs de débit à fenêtre glissante dans Redis Lua. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Lua Academy ?

Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Limitation du débit avec Lua » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?

Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. EVAL et environnement Lua de Redis
  2. Opérations atomiques et transactions
  3. Limitation du débit avec Lua
  4. SCRIPT LOAD et EVALSHA
← Retour à Lua Academy