Transacciones, Lua y atomicidad
Redis garantiza atomicidad por comando. Para operaciones compuestas, puedes usar MULTI/EXEC, WATCH o scripts Lua.
Atomicidad por comando
Este comando es atomico:
INCR contadorDos clientes pueden ejecutar INCR a la vez y Redis mantendra el contador correcto.
MULTI y EXEC
Agrupa comandos:
MULTI
INCR visitas:home
EXPIRE visitas:home 60
EXECRedis ejecuta los comandos en orden cuando llega EXEC.
Limitaciones
MULTI/EXEC no hace rollback como una base relacional. Si un comando falla en ejecucion, otros comandos pueden haberse ejecutado.
Usalo para operaciones simples y bien conocidas.
WATCH
WATCH implementa control optimista.
WATCH stock:producto:10
GET stock:producto:10
MULTI
DECR stock:producto:10
EXECSi otro cliente modifica la clave vigilada antes de EXEC, la transaccion falla y debes reintentar.
Lua
Los scripts Lua se ejecutan atomicamente.
Ejemplo: rate limiting con incremento y expiracion en una sola operacion.
local current = redis.call("INCR", KEYS[1])
if current == 1 then
redis.call("EXPIRE", KEYS[1], ARGV[1])
end
return currentEjecucion:
EVAL 'local current = redis.call("INCR", KEYS[1]); if current == 1 then redis.call("EXPIRE", KEYS[1], ARGV[1]); end; return current' 1 rate:user:1 60Locks seguros
Crear lock:
SET lock:pedido:10 worker-1 NX PX 30000Liberar lock de forma segura requiere comprobar valor:
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
endAsi evitas borrar un lock que ya expiro y fue adquirido por otro proceso.
Idempotencia
Redis ayuda a evitar duplicados:
SET evento:abc procesado NX EX 86400Si devuelve OK, procesas. Si no, ya fue visto.
Contadores con ventana
Ventana fija:
INCR rate:ip:1.2.3.4:2026-06-26T10:30
EXPIRE rate:ip:1.2.3.4:2026-06-26T10:30 60Para que sea atomico, usa Lua.
Streams y ACK
Streams permiten entregar mensajes y confirmarlos:
XADD events:orders * type created order_id 10
XGROUP CREATE events:orders workers $ MKSTREAM
XREADGROUP GROUP workers worker-1 COUNT 10 STREAMS events:orders >
XACK events:orders workers 1690000000000-0Buenas practicas
- Prefiere comandos atomicos simples cuando existan.
- Usa Lua para operaciones cortas y criticas.
- Evita scripts Lua largos o con logica de negocio compleja.
- Pon TTL a locks, marcas de idempotencia y ventanas de rate limit.
- Disena reintentos:
WATCHpuede fallar correctamente.
