Redis: cachelagring och meddelanden (Pub/Sub, Streams) · Lektion

Distribuerad hastighetsbegränsning

Samordna begränsningar av begäranden över många appinstanser med Redis-räknare och atomiska Lua-skript för algoritmer med fast fönster, glidande fönster och token bucket.

Lektion 4 av 413 steg

Distribuerad hastighetsbegränsning är en gratis lektion i Redis: cachelagring och meddelanden (Pub/Sub, Streams) på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Redis: cachelagring och meddelanden (Pub/Sub, Streams), och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Redis: cachelagring och meddelanden (Pub/Sub, Streams) innehåller totalt 4 lektioner.

Lokala begränsningar skalar inte

En hastighetsbegränsare i minnet räknar endast förfrågningar på en server. Med många appinstanser bakom en lastbalanserare behöver du en delad bild av användningen. Redis är centraliserat och atomärt och är därför den naturliga samordningspunkten.

Räknare med fast tidsfönster

Den enklaste algoritmen är en räknare per tidsfönster. Öka nyckeln med INCR och ange en TTL som motsvarar fönstret vid den första ökningen. Avvisa förfrågningen när antalet överskrider gränsen.

INCR rl:user:42:1716900000
EXPIRE rl:user:42:1716900000 60

Race condition

Om INCR och EXPIRE körs som två kommandon finns risk för att en nyckel blir utan TTL om klienten avslutas däremellan. Ett atomärt Lua-skript löser detta genom att köra båda som en enda åtgärd.

local c = redis.call('INCR', KEYS[1])
if c == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]) end
return c

Varför atomicitet är viktigt

Med många instanser kan samtidiga förfrågningar annars läsa och skriva räknare i en sammanflätad ordning. Lua-skript körs atomärt på servern, så hela kontrollen och ökningen sker utan sammanflätning.

Problemet med toppar vid fasta tidsfönster

Fasta tidsfönster tillåter toppar vid gränsen: en klient kan skicka motsvarande ett helt fönsters mängd i slutet av ett fönster och sedan igen i början av nästa, vilket fördubblar den effektiva hastigheten.

Logg för glidande tidsfönster

En sorterad mängd med tidsstämplar för förfrågningar ger ett exakt glidande tidsfönster. Ta bort gamla poster, räkna de återstående och lägg till den nya förfrågningen, allt i ett enda skript.

ZREMRANGEBYSCORE rl:user:42 0 (now-window)
ZCARD rl:user:42
ZADD rl:user:42 now now

Token bucket

En token bucket tillåter kontrollerade toppar. Tokens fylls på med en fast hastighet upp till ett tak; varje förfrågning förbrukar en token. Lagra antalet tokens och tiden för den senaste påfyllningen i en hash och uppdatera atomärt med Lua.

HSET rl:tb:user:42 tokens 10 ts 1716900000

Logik för påfyllning

Vid varje förfrågning beräknar du den förflutna tiden, lägger till elapsed * rate tokens (begränsat till hinkens storlek) och tillåter sedan förfrågningen om minst en token återstår. Lua-skriptet håller detta konsekvent mellan instanserna.

Välja en algoritm

Fast tidsfönster: billigast, men tillåter toppar vid gränsen. Glidande logg: exakt men kräver mer minne. Token bucket: jämn hastighet med kontrollerade toppar, utmärkt för API:er.

Returnera användbara headers

Informera klienterna om deras begränsningar: returnera antalet återstående förfrågningar och återställningstiden så att välfungerande klienter kan begränsa sig själva.

# X-RateLimit-Remaining: 7
# X-RateLimit-Reset: 1716900060

Anmärkning om motståndskraft

Bestäm en reservstrategi om Redis inte kan nås: fail open (tillåt trafik) för tillgänglighet eller fail closed (neka trafik) för skydd. Det rätta valet beror på om gränsen skyddar kostnader eller korrekthet.

Snabbtest

Testa dina kunskaper om distribuerad hastighetsbegränsning.

Sammanfattning

Du byggde distribuerad hastighetsbegränsning med Redis: räknare med fasta tidsfönster, atomärt Lua för att undvika TTL-läckor och race conditions, loggar med glidande tidsfönster och sorterade mängder samt token buckets för jämna toppar. Genom att centralisera räknarna blir begränsningarna konsekventa mellan alla appinstanser. Välj medvetet reservstrategi mellan fail open och fail closed.

Gratis att börja

Lär dig Redis: cachelagring och meddelanden (Pub/Sub, Streams) 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” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Redis: cachelagring och meddelanden (Pub/Sub, Streams), inklusive ”Distribuerad hastighetsbegränsning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Redis: cachelagring och meddelanden (Pub/Sub, Streams) innehåller totalt 4 lektioner.

Vad lär jag mig i ”Distribuerad hastighetsbegränsning”?

Samordna begränsningar av begäranden över många appinstanser med Redis-räknare och atomiska Lua-skript för algoritmer med fast fönster, glidande fönster och token bucket. Ni övar på Redis: cachelagring och meddelanden (Pub/Sub, Streams) 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 Redis: cachelagring och meddelanden (Pub/Sub, Streams)?

Du behöver inga förkunskaper. Utbildningen i Redis: cachelagring och meddelanden (Pub/Sub, Streams) 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”?

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 Redis: cachelagring och meddelanden (Pub/Sub, Streams)-lektionen?

Ja. Varje Redis: cachelagring och meddelanden (Pub/Sub, Streams)-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

  1. Distribuerade lås med Redis
  2. Mönster för ledarval
  3. Redis som samordningstjänst
  4. Distribuerad hastighetsbegränsning
← Tillbaka till Redis: cachelagring och meddelanden (Pub/Sub, Streams)