Redis: 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.
1. O que é uma Transação?
Uma transação é uma coleção de comandos que são executados sequencialmente sem interrupção por outros comandos.
BASH
MULTI → Comando 1 → Comando 2 → Comando 3 → EXEC
2. Comandos Básicos
(1) MULTI: Iniciar uma Transação
REDIS
MULTI
OK
(2) EXEC: Executar a Transação
REDIS
MULTI
OK
SET nome "Alice"
QUEUED
SET age 25
QUEUED
EXEC
1) OK
2) OK
(3) DISCARD: Cancelar a Transação
REDIS
MULTI
OK
SET nome "Bob"
QUEUED
DISCARD
OK
3. Propriedades da Transação
(1) 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"
(2) 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.
4. WATCH: Lock Otimista
WATCH monitora chaves. Se qualquer chave monitorada for modificada antes da transação executar, a transação é cancelada.
(1) 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)
(2) 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
5. 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
6. Transações vs Scripts
(1) 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
(2) Transação vs Script Comparação
| Recurso | Transação | Script Lua |
|---|---|---|
| Atomicidade | ✅ | ✅ |
| Lógica condicional | ❌ | ✅ |
| Loops | ❌ | ✅ |
| Desempenho | Bom | Melhor |
| Complexidade | Simples | Mais complexo |
7. 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
8. 📝 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
9. 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.
📝 Exercícios
- Prática: Execute os comandos apresentados nesta lição
- Experimentação: Teste variações dos comandos aprendidos
- Aplicação: Aplique os conceitos em um projeto prático