Una dintre cele mai populare utilizări ale limbajului Lua în arhitecturile backend este motorul integrat din Redis. Scripturile transmise prin comanda EVAL sau încărcate prin SCRIPT LOAD se execută 100% atomic direct în firul principal al serverului Redis, eliminând complet condițiile de cursă (Race Conditions) și economisind zeci de apeluri de rețea dus-întors (Round-Trip Time).
Implementarea unui Rate Limiter atomic pe IP cu Redis și Lua
-- Script Lua rulat direct în memoria serverului Redis:
-- KEYS[1]: cheia de identificare a utilizatorului (ex: "rate:client:192.168.1.5")
-- ARGV[1]: limita maximă de cereri permise (ex: "10")
-- ARGV[2]: fereastra de expirare în secunde (ex: "60")
local cheie = KEYS[1]
local limita = tonumber(ARGV[1])
local expirareSecunde = tonumber(ARGV[2])
-- Citim numărul curent de cereri efectuate:
local cereriCurente = redis.call('get', cheie)
if cereriCurente and tonumber(cereriCurente) >= limita then
-- Limita a fost atinsă: blocăm cererea
return 0
else
-- Incrementăm contorul atomic:
local nouTotal = redis.call('incr', cheie)
if nouTotal == 1 then
-- Dacă este prima cerere din fereastră, setăm expirarea automată:
redis.call('expire', cheie, expirareSecunde)
end
return 1 -- Cerere aprobată!
end