Deși comenzile individuale în Redis sunt inerent atomice datorită execuției single-threaded, operațiunile de business necesită adesea gruparea mai multor comenzi într-un bloc indivizibil. Redis rezolvă această provocare prin două instrumente distincte: Tranzacții (MULTI / EXEC / WATCH) pentru consistență logică și Pipelining pentru optimizarea latenței de rețea.
# Scenariu: Transfer de fonduri între două conturi (Cont A -> Cont B)
# 1. Supraveghem cheia sursă pentru a detecta modificări concurente
WATCH cont:user_a:balanta
# 2. Citim valoarea curentă din aplicație
# Dacă între timp alt proces modifică cont:user_a:balanta, tranzacția va fi respinsă!
# 3. Deschidem blocul de tranzacție
MULTI
# 4. Enqueue comenzile (Redis nu le execută încă, ci le plasează în coada tranzacției)
DECRBY cont:user_a:balanta 150
INCRBY cont:user_b:balanta 150
# 5. Executăm atomice toate comenzile
EXEC
# Dacă nicio modificare externă nu a avut loc pe cheile supravegheate, EXEC returnează [OK, OK].
# Dacă o altă conexiune a modificat cheia după WATCH, EXEC returnează (nil) (tranzacție avortată).
În mod standard, fiecare comandă Redis implică un drum dus-întors în rețea (Round-Trip Time – RTT). Dacă dorești să execuți 10.000 de comenzi, un ping de 1ms înseamnă 10 secunde pierdute doar pe transferul pachetelor de rețea!
# Prin Pipelining, clientul trimite sute sau mii de comenzi într-un singur pachet TCP,
# iar serverul răspunde cu toate rezultatele într-o singură transmisie compactă:
# Pseudocod Python (redis-py):
pipe = r.pipeline()
for i in range(10000):
pipe.set(f"senzor:{i}", f"valoare_{i}")
rezultate = pipe.execute() # Un singur apel de rețea RTT pentru 10.000 de operațiuni!
Diferența dintre Redis Transactions și ACID SQL
Tranzacțiile Redis nu suportă Rollback în caz de eroare sintactică sau de tip la rulare (de exemplu, apelarea unei comenzi de tip String pe o cheie de tip List). Dacă o comandă din interiorul blocului eșuează, restul comenzilor vor fi executate oricum. Pentru logici tranzacționale complexe cu validare la nivel de cod, se recomandă utilizarea scripturilor Lua (comanda EVAL).