Como Executar Transações no Redis

Introdução

O Redis é um datastore ou armazenamento de dados open-source de chave-valor na memória. O Redis lhe permite planejar uma sequência de comandos e executá-los um após o outro, um procedimento conhecido como transação. Cada transação é tratada como uma operação ininterrupta e isolada, o que garante a integridade dos dados. Os clientes não podem executar comandos enquanto um bloco de transação está sendo executado.

Este tutorial aborda como executar e cancelar transações e também inclui algumas informações sobre as armadilhas comumente associadas às transações.

Como Utilizar Este Guia

Este guia está no formato de referência rápida com trechos de linha de comando independentes. Recomendamos que você pule para qualquer seção que seja relevante para a tarefa que você está tentando concluir.

Os comandos mostrados neste guia foram testados em um servidor Ubuntu 18.04 executando a versão 4.0.9 do Redis. Para configurar um ambiente semelhante, você pode seguir o Passo 1 do nosso guia Como Instalar e Proteger o Redis no Ubuntu 18.04. Vamos demonstrar como esses comandos se comportam executando-os com redis-cli, a interface de linha de comando do Redis. Observe que se você estiver usando uma interface Redis diferente — Redli, por exemplo — a saída exata de certos comandos pode ser diferente.

Como alternativa, você pode provisionar uma instância de banco de dados Redis gerenciada para testar esses comandos, mas observe que, dependendo do nível de controle permitido pelo seu provedor de banco de dados, alguns comandos neste guia podem não funcionar como descrito. Para provisionar um banco de dados gerenciado na DigitalOcean, siga nossa documentação de produto para Managed Databases. Então, você deve instalar ou o Redli ou configurar um túnel TLS para conectar-se ao banco de dados gerenciado por TLS.

Executando Transações

O comando multi diz ao Redis para iniciar um bloco de transação. Quaisquer comandos subsequentes serão colocados na fila até você executar um comando exec, que os executará.

Os seguintes comandos formam um único bloco de transação. O primeiro comando inicia a transação, o segundo define uma chave contendo uma string com o valor de 1, o terceiro incrementa o valor em 1, o quarto incrementa seu valor em 40, o quinto retorna o valor atual da string e o último executa o bloco de transação:

  • multi
  • set key_MeaningOfLife 1
  • incr key_MeaningOfLife
  • incrby key_MeaningOfLife 40
  • get key_MeaningOfLife
  • exec

Depois de executar o multi, o redis-cli responderá a cada um dos seguintes comandos com QUEUED. Depois de executar o comando exec, ele mostrará a saída de cada um desses comandos individualmente:

Output1) OK 2) (integer) 2 3) (integer) 42 4) "42" 

Os comandos incluídos em um bloco de transação são executados sequencialmente na ordem em que estão enfileirados. As transações Redis são atômicas, o que significa que todos os comandos em um bloco de transações são processados (ou seja, são aceitos como válidos e enfileirados para serem executados) ou nenhum deles. No entanto, mesmo que um comando seja enfileirado com êxito, ele ainda poderá gerar um erro quando executado. Nesses casos, os outros comandos da transação ainda podem ser executados, mas o Redis ignorará o comando causador de erros. Consulte a seção compreendendo erros de transação para mais detalhes.

Cancelando Transações

Para cancelar uma transação, execute o comando discard. Isso impede que qualquer comando previamente enfileirado seja executado:

  • multi
  • set key_A 146
  • incrby key_A 10
  • discard
OutputOK 

O comando discard retorna a conexão ao estado normal, o que instrui o Redis a executar comandos únicos, como de costume. Você precisará executar o multi novamente para informar ao servidor que está iniciando outra transação.

Entendendo Erros de Transação

Alguns comandos podem ser impossíveis de enfileirar, como comandos com erros de sintaxe. Se você tentar enfileirar um comando sintaticamente incorreto, o Redis retornará um erro.

A transação a seguir cria uma chave chamada key_A e depois tenta incrementá-la em 10. No entanto, um erro de ortografia no comando incrby gera um erro e fecha a transação:

  • multi
  • set key_A 146
  • incrbuy key_A 10
Output(error) ERR unknown command 'incrbuy' 

Se você tentar executar um comando exec depois de tentar enfileirar um comando com um erro de sintaxe como esse, você receberá outra mensagem de erro informando que a transação foi descartada:

  • exec
Output(error) EXECABORT Transaction discarded because of previous errors. 

Em casos como este, você precisará reiniciar o bloco de transações e certificar-se de inserir cada comando corretamente.

Alguns comandos impossíveis são possíveis de se enfileirar, como executar incr em uma chave que contém apenas uma string. Como esse comando é sintaticamente correto, o Redis não retornará um erro se você tentar incluí-lo em uma transação e não impedirá que você execute o exec. Em casos como este, todos os outros comandos na fila serão executados, mas o comando impossível retornará um erro:

  • multi
  • set key_A 146
  • incrby key_A "ten"
  • exec
Output1) OK 2) (error) ERR value is not an integer or out of range 

Para mais informações sobre como o Redis lida com erros dentro de transações, consulte a documentação oficial sobre o assunto.

Conclusão

Este guia detalha vários comandos usados para criar, executar e cancelar transações no Redis. Se houver outros comandos, argumentos ou procedimentos relacionados que você gostaria de ver descritos neste guia, peça ou faça sugestões nos comentários abaixo.

Para obter mais informações sobre comandos Redis, consulte nossa série de tutoriais Como Gerenciar um Banco de Dados Redis.