Distribuerad hastighetsbegränsning med Redis
Lär er hur ni delar tillståndet för hastighetsbegränsning mellan flera gateway- och tjänsteinstanser med Redis, atomiska operationer och Lua-skript för att undvika race conditions.
Distribuerad hastighetsbegränsning med Redis är en gratis lektion i API-begränsning och skalbarhetsmönster på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för API-begränsning och skalbarhetsmönster, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i API-begränsning och skalbarhetsmönster innehåller totalt 4 lektioner.
Problemet med flera instanser
När du kör flera gateway-repliker innebär det att varje instans har sin egen räknare i minnet att en klient totalt får N x limit — en gång per instans.
För att tillämpa en enda global gräns måste varje instans läsa och uppdatera delat tillstånd.
Varför Redis
Redis är det självklara valet för distribuerad hastighetsbegränsning eftersom det erbjuder:
- Submillisekunds läsningar och skrivningar i minnet
- Atomiska kommandon som
INCR - Inbyggd giltighetstid för automatiska återställningar av fönster
- Lua-skript för atomisk logik i flera steg
En naiv räknare
Den enklaste räknaren med fast fönster använder INCR tillsammans med EXPIRE:
Den första begäran i ett fönster skapar nyckeln och ställer in en TTL; senare begäranden ökar bara värdet.
INCR rate:user:42
-- if reply == 1 (first hit):
EXPIRE rate:user:42 60Kapplöpningstillståndet
Att köra INCR och sedan EXPIRE som två separata anrop har ett fel: om processen kraschar däremellan får nyckeln ingen TTL och gränsen återställs aldrig.
Lösningen är att göra kontrollen och ökningen atomiska.
Atomicitet med Lua
Redis kör ett Lua-skript som en enda atomisk enhet. Vi kan kontrollera räkningen, öka den och ställa in giltighetstiden utan avbrott.
local c = redis.call('INCR', KEYS[1])
if c == 1 then
redis.call('EXPIRE', KEYS[1], ARGV[2])
end
if c > tonumber(ARGV[1]) then
return 0
end
return 1Anropa skriptet
Från gatewayen anropar du skriptet med EVAL och skickar med nyckeln, gränsen och fönstrets storlek.
Ett returvärde på 1 betyder tillåt; 0 betyder neka med 429 Too Many Requests.
allowed = redis.eval(script, keys=['rate:user:42'], args=[100, 60])
if allowed == 0:
return Response(status=429)Sliding window med sorterade mängder
För en jämnare begränsning lagrar du tidsstämplar för begäranden i en sorterad mängd. Ta bort gamla poster, räkna det som återstår och lägg sedan till den nya.
ZREMRANGEBYSCORE rate:user:42 0 (now-window)
ZCARD rate:user:42
ZADD rate:user:42 now nowReturnera headers för hastighetsbegränsning
Bra gateways talar om för klienterna var de befinner sig med hjälp av standardheaders:
X-RateLimit-LimitX-RateLimit-RemainingRetry-Aftervid429
Lua-skriptet kan returnera återstående antal tillsammans med flaggan för tillåtelse.
Hantera Redis-fel
Vad händer om Redis inte kan nås? Det finns två strategier:
- Fail open — tillåt trafik; prioriterar tillgänglighet
- Fail closed — avvisa trafik; prioriterar skydd
De flesta API:er använder fail open med en lokal fallback-begränsare för att undvika ett totalt avbrott.
Minska latensen
Varje kontroll av begränsningen innebär ett nätverkshopp. Minska overhead genom att:
- Placera Redis nära gatewayen
- Använda connection pooling
- Samla räknare i batchar med en kortvarig lokal cache för mycket frekventa nycklar
Använda identitet som nyckel
Nyckeln för hastighetsbegränsningen anger vad du begränsar. Vanliga alternativ är:
rate:ip:1.2.3.4för anonym trafikrate:user:42för autentiserade användarerate:apikey:abcför API-klienter
Välj den mest specifika tillgängliga identiteten så att en enda missbrukare inte kan tömma en gemensam bucket.
Snabbtest
Testa dina kunskaper om distribuerad hastighetsbegränsning.
Sammanfattning
Du har lärt dig att dela tillståndet för hastighetsbegränsning mellan instanser:
- En gemensam Redis-databas ger en global begränsning
- Lua-skript gör kontroll och inkrementering atomiska
- Sorted sets möjliggör glidande fönster
- Välj mellan fail open och fail closed vid Redis-avbrott
Lär dig API-begränsning och skalbarhetsmönster med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Distribuerad hastighetsbegränsning med Redis” gratis?
Ja – hela texten till ”Distribuerad hastighetsbegränsning med Redis” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i API-begränsning och skalbarhetsmönster, kan Ni uppgradera till CoddyKit PRO. Kursen i API-begränsning och skalbarhetsmönster innehåller totalt 4 lektioner.
Vad lär jag mig i ”Distribuerad hastighetsbegränsning med Redis”?
Lär er hur ni delar tillståndet för hastighetsbegränsning mellan flera gateway- och tjänsteinstanser med Redis, atomiska operationer och Lua-skript för att undvika race conditions. Ni övar på API-begränsning och skalbarhetsmönster med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig API-begränsning och skalbarhetsmönster?
Du behöver inga förkunskaper. Utbildningen i API-begränsning och skalbarhetsmönster på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Distribuerad hastighetsbegränsning med Redis”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här API-begränsning och skalbarhetsmönster-lektionen?
Ja. Varje API-begränsning och skalbarhetsmönster-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Mönster för integrering av API-gatewayer
- Globala och tjänstespecifika anropsgränser
- Dynamisk konfiguration av anropsgränser
- Distribuerad hastighetsbegränsning med Redis