Rate limiting met Lua
Implementeer atomair sliding-window-rate limiters in Redis Lua
Rate limiting met Lua is een gratis Lua Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Lua Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Lua Academy bevat in totaal 4 lessen.
Waarom Redis voor snelheidsbeperking?
Redis biedt atomische bewerkingen, snelheid dankzij opslag in het geheugen en gedeelde toestand tussen meerdere toepassingsservers — daardoor is het ideaal voor gedistribueerde snelheidsbeperking.
Eenvoudige teller voor een vast tijdvenster
Tel verzoeken per tijdvenster met INCR en 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 60Glijdend venster met gesorteerde verzamelingen
Een nauwkeurigere snelheidsbeperker gebruikt een gesorteerde verzameling met tijdstempels als sleutels. Verwijder oude vermeldingen, voeg het huidige verzoek toe en tel de grootte van de verzameling.
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 100Tokenbucketalgoritme
Een tokenbucket staat piekbelasting toe en behoudt tegelijk een gemiddelde snelheid. Vul tokens na verloop van tijd bij; elk verzoek verbruikt één token.
Lekbakalgoritme
De lekbak dwingt een strikt constant tempo af. Verzoeken worden in een wachtrij (de bak) geplaatst en met een vaste afvoersnelheid verwerkt. Overloop wordt geweigerd.
Limieten per gebruiker en per IP
Gebruik de gebruikers-ID, API-sleutel of het IP-adres als sleutel voor de snelheidsbeperker: rate:{userId}, rate:{ip}, rate:{apiKey}.
Snelheidslimieten per niveau
Pas verschillende limieten toe op basis van het gebruikersniveau (gratis versus pro). Controleer het niveau van de gebruiker voordat je bepaalt welke limiet moet worden afgedwongen.
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"Headers teruggeven
Geef het resterende aantal verzoeken en de reset-tijd vanuit het script terug, zodat de toepassing X-RateLimit-headers in het HTTP-antwoord kan instellen.
return {allowed, limit - count, resetTime}Gegarandeerde atomiciteit in een gedistribueerde omgeving
Omdat de volledige controle op de snelheidslimiet in één EVAL-script staat, is deze atomair voor alle instanties van toepassingsservers die hetzelfde Redis-cluster delen.
Opmerking over Redis Cluster
In de modus Redis Cluster moeten alle KEYS die in een script worden gebruikt naar hetzelfde slot worden gehasht. Gebruik hash-tags: rate:{user123}:requests om ze op dezelfde locatie te houden.
Snelheidslimieten monitoren
Registreer afgewezen verzoeken met gebruikers- en IP-informatie. Stel waarschuwingen in wanneer afwijzingspercentages sterk stijgen (dat wijst op een aanval of verkeerde configuratie).
Vraag over snelheidsbeperking
Waarom is een Redis-Lua-script beter voor snelheidsbeperking dan tellers aan de toepassingskant?
Samenvatting: snelheidsbeperking met Lua
Implementeer snelheidsbeperkers in Redis Lua met INCR+EXPIRE (vast tijdvenster) of gesorteerde verzamelingen (glijdend venster). Het atomische script garandeert correctheid over gedistribueerde toepassingsservers heen. Geef de resterende quota terug voor HTTP-headers.
Leer Lua met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 40
- Lessen
- 159
Veelgestelde vragen
Is de les “Rate limiting met Lua” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Lua Academy, waaronder “Rate limiting met Lua”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Lua Academy bevat in totaal 4 lessen.
Wat leer ik in “Rate limiting met Lua”?
Implementeer atomair sliding-window-rate limiters in Redis Lua Je oefent met Lua Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Lua Academy te beginnen?
Ervaring vooraf is niet nodig. Lua Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Rate limiting met Lua”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Lua Academy?
Ja. Elke les over Lua Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- EVAL en de Redis Lua-omgeving
- Atomaire bewerkingen en transacties
- Rate limiting met Lua
- SCRIPT LOAD en EVALSHA