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
▶ Experimente

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
▶ Experimente

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
▶ Experimente

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
▶ Experimente

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

📝 Atividades

  1. Prática de transação: Use MULTI/EXEC para executar múltiplos comandos
  2. Prática de lock otimista: Use WATCH para implementar um lock otimista simples
  3. 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.

100%