Ograniczanie częstotliwości za pomocą Lua
Proszę implementować atomowe ograniczniki częstotliwości oparte na przesuwanym oknie w Redis Lua.
Ograniczanie częstotliwości za pomocą Lua to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Dlaczego Redis do ograniczania liczby żądań?
Redis zapewnia operacje atomowe, szybkość pamięci operacyjnej oraz współdzielony stan między wieloma serwerami aplikacji — dzięki czemu idealnie nadaje się do rozproszonego ograniczania liczby żądań.
Prosty licznik w stałym oknie czasowym
Żądania w każdym oknie czasowym należy zliczać za pomocą INCR i 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 60Okno przesuwne z uporządkowanymi zbiorami
Dokładniejszy mechanizm ograniczania liczby żądań korzysta z uporządkowanego zbioru indeksowanego sygnaturą czasową. Należy usuwać stare wpisy, dodawać bieżące żądanie i zliczać elementy zbioru.
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 100Algorytm wiadra tokenów
Wiadro tokenów pozwala obsługiwać nagłe skoki liczby żądań przy zachowaniu średniej częstotliwości. Tokeny są uzupełniane w czasie, a każde żądanie zużywa jeden token.
Algorytm nieszczelnego wiadra
Nieszczelne wiadro wymusza stałą częstotliwość. Żądania są umieszczane w kolejce (wiadrze) i przetwarzane ze stałą częstotliwością opróżniania. Żądania przekraczające pojemność są odrzucane.
Limity na użytkownika i adres IP
Mechanizm ograniczania liczby żądań należy indeksować identyfikatorem użytkownika, kluczem API lub adresem IP: rate:{userId}, rate:{ip}, rate:{apiKey}.
Warstwowe limity liczby żądań
Należy stosować różne limity zależnie od poziomu użytkownika (free lub pro). Przed wyborem egzekwowanego limitu należy sprawdzić poziom użytkownika.
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"Zwracanie nagłówków
Skrypt powinien zwracać liczbę pozostałych żądań i czas resetu, aby aplikacja mogła ustawić nagłówki X-RateLimit w odpowiedzi HTTP.
return {allowed, limit - count, resetTime}Rozproszona gwarancja atomowości
Ponieważ całe sprawdzanie limitu liczby żądań odbywa się w jednym skrypcie EVAL, jest ono atomowe we wszystkich instancjach serwerów aplikacji współdzielących klaster Redis.
Uwaga dotycząca klastra Redis
W trybie Redis Cluster wszystkie klucze KEYS używane w skrypcie muszą zostać przypisane do tego samego slotu. Należy używać znaczników haszowania: rate:{user123}:requests, aby wymusić umieszczenie ich w tym samym miejscu.
Monitorowanie limitów liczby żądań
Należy rejestrować odrzucone żądania wraz z informacjami o użytkowniku i adresie IP. Należy skonfigurować alerty uruchamiane przy nagłym wzroście odsetka odrzuceń, który może wskazywać na atak lub błędną konfigurację.
Pytanie o ograniczanie liczby żądań
Dlaczego skrypt Lua Redis jest lepszy do ograniczania liczby żądań niż liczniki po stronie aplikacji?
Podsumowanie: ograniczanie liczby żądań za pomocą Lua
Mechanizmy ograniczania liczby żądań należy implementować w Redis Lua za pomocą INCR+EXPIRE (stałe okno) lub uporządkowanych zbiorów (okno przesuwne). Atomowy skrypt gwarantuje poprawność we wszystkich rozproszonych serwerach aplikacji. Należy zwracać pozostały limit na potrzeby nagłówków HTTP.
Często zadawane pytania
Czy lekcja „Ograniczanie częstotliwości za pomocą Lua” jest bezpłatna?
Tak — pełny tekst „Ograniczanie częstotliwości za pomocą Lua” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Ograniczanie częstotliwości za pomocą Lua”?
Proszę implementować atomowe ograniczniki częstotliwości oparte na przesuwanym oknie w Redis Lua. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Ograniczanie częstotliwości za pomocą Lua”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- EVAL i środowisko Lua Redis
- Operacje atomowe i transakcje
- Ograniczanie częstotliwości za pomocą Lua
- SCRIPT LOAD i EVALSHA