Scriptare Tranzacțională în Redis cu Lua: Comanda EVAL și redis.call() în Lua

Ecosistem & Utilizări Practice Redis 7.0+ / Lua 5.1

Ghid complet pentru rularea scripturilor Lua pe serverul Redis: executare atomică fără blocaje de concurență, tablourile KEYS și ARGV, și API-ul redis.call().

Sintaxă
redis.call('get', KEYS[1]); redis.call('set', KEYS[1], ARGV[1])

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