Transações do Redis
Transações Redis permitem executar múltiplos comandos como uma única unidade. Esta lição aborda o uso e cuidados com transações.
O que é uma Transação?
Uma transação é uma coleção de comandos que são executados sequencialmente sem interrupção por outros comandos.
MULTI → Comando 1 → Comando 2 → Comando 3 → EXEC
Comandos Básicos
MULTI: Iniciar uma Transação
REDIS
MULTI
OK
EXEC: Executar a Transação
REDIS
MULTI
OK
SET nome "Alice"
QUEUED
SET age 25
QUEUED
EXEC
1) OK
2) OK
DISCARD: Cancelar a Transação
REDIS
MULTI
OK
SET nome "Bob"
QUEUED
DISCARD
OK
Propriedades da Transação
Fila de Comandos
Comandos em uma transação não são executados imediatamente, mas colocados em uma fila:
REDIS
MULTI
OK
SET a 1
QUEUED
SET b 2
QUEUED
GET a
QUEUED
EXEC
1) OK
2) OK
3) "1"
Atomicidade
Comandos em uma transação são todos executados ou nenhum é executado:
REDIS
MULTI
OK
SET a 1
QUEUED
SET b 2
QUEUED
EXEC
1) OK
2) OK
⚠️ Observação: Transações Redis não suportam rollback. Se um comando falhar dentro de uma transação, outros comandos ainda executam.
WATCH: Lock Otimista
WATCH monitora chaves. Se qualquer chave monitorada for modificada antes da transação executar, a transação é cancelada.
Uso Básico
REDIS
# Monitorar uma chave
WATCH minhaChave
OK
# Iniciar uma transação
MULTI
OK
# Modificar a chave
SET minhaChave "novo_valor"
QUEUED
# Executar a transação
EXEC
(nil) # Retorna nil se a transação foi cancelada (chave foi modificada)
Implementando Lock Otimista
Exemplo: Lock Otimista
BASH
# Cliente 1
WATCH balance
GET balance
MULTI
SET balance 900
EXEC
# Cliente 2 (antes do Cliente 1 executar EXEC)
SET balance 800
Casos de Uso
1. Dedução de Estoque
Exemplo: Diminuir Estoque
BASH
# Diminuir estoque (operação atômica)
MULTI
DECR stock:product:123
INCR sold:product:123
EXEC
2. Transferência de Dinheiro
Exemplo: Transferência
BASH
# Transferir: enviar 100 do usuário A para o usuário B
MULTI
DECRBY balance:user:a 100
INCRBY balance:user:b 100
EXEC
3. Operações em Lote
Exemplo: Configuração em Lote
BASH
# Definir múltiplas chaves
MULTI
SET user:1:name "Alice"
SET user:1:age 25
SET user:1:email "alice@example.com"
EXEC
Transações vs Scripts
Scripts Lua (Recomendados)
Scripts Lua são mais poderosos que transações, suportando lógica condicional e loops:
REDIS
# Operação atômica: deduzir apenas se o saldo for suficiente
EVAL "
local balance = tonumber(redis.call('GET', KEYS[1]) or 0)
if balance >= tonumber(ARGV[1]) then
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1
else
return 0
end
" 1 balance:user:a 100
Transação vs Script Comparação
| Recurso | Transação | Script Lua |
|---|---|---|
| Atomicidade | ✅ | ✅ |
| Lógica condicional | ❌ | ✅ |
| Loops | ❌ | ✅ |
| Desempenho | Bom | Melhor |
| Complexidade | Simples | Mais complexo |
Notas Importantes
⚠️ Sem rollback: Transações Redis não suportam rollback. Se um comando falhar, outros comandos ainda executam.
⚠️ Erros de comando: Erros de sintaxe cancelam a transação inteira. Erros de tempo de execução não afetam outros comandos.
💡 Scripts Lua recomendados: Para operações atômicas complexas, scripts Lua são recomendados.
❓ Perguntas Frequentes
P Transações Redis suportam rollback?
R Não. Transações Redis não suportam rollback. Use scripts Lua se você precisar de comportamento de rollback.
P O que WATCH faz?
R WATCH implementa lock otimista. Ele monitora chaves e cancela a transação se qualquer chave monitorada for modificada.
P Comandos em uma transação são executados atomicamente?
R Sim. Comandos em uma transação são executados sequencialmente sem interrupção por outros comandos.
📖 Resumo
- MULTI inicia uma transação, EXEC a executa, DISCARD a cancela
- Comandos são enfileirados na transação e executados sequencialmente no EXEC
- WATCH fornece lock otimista, monitorando chaves para alterações
- Transações Redis não suportam rollback
- Para operações atômicas complexas, scripts Lua são recomendados
📝 Atividades
- Prática de transação: Use MULTI/EXEC para executar múltiplos comandos
- Prática de lock otimista: Use WATCH para implementar um lock otimista simples
- Prática de script Lua: Use EVAL para executar um script Lua
Próxima Lição
Na próxima lição, nós aprenderemos sobre Persistência do Redis, abordando métodos de persistência RDB e AOF.



