Como Gerenciar Bancos de Dados e Chaves no Redis

Introdução

O Redis é um datastore ou armazenamento de dados open-source de chave-valor na memória. Um datastore de chave-valor é um tipo de banco de dados NoSQL no qual chaves servem como identificadores exclusivos para seus valores associados. Qualquer instância Redis inclui um número de bancos de dados, cada um dos quais podendo conter muitas chaves diferentes de uma variedade de tipos de dados. Neste tutorial, veremos como selecionar um banco de dados, mover chaves entre bancos de dados e gerenciar e excluir chaves.

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.

Gerenciando Bancos de Dados

Nativamente, uma instância do Redis suporta 16 bancos de dados lógicos. Esses bancos de dados são efetivamente isolados um do outro e, quando você executa um comando em um banco de dados, ele não afeta nenhum dado armazenado em outros bancos de dados na sua instância do Redis.

Os bancos de dados Redis são numerados de 0 a 15 e, por padrão, você se conecta ao banco de dados 0 quando se conecta à sua instância Redis. No entanto, você pode alterar o banco de dados que está usando com o comando select após conectar-se:

  • select 15

Se você selecionou um banco de dados diferente de 0, ele será refletido no prompt do redis-cli:

Para trocar todos os dados mantidos em um banco de dados pelos dados mantidos em outro, use o comando swapdb. O exemplo a seguir trocará os dados mantidos no banco de dados 6 pelos dados no banco de dados 8, e quaisquer clientes conectados a quaisquer dos bancos de dados poderão ver as alterações imediatamente:

  • swapdb 6 8

O swapdb retornará OK se a troca for bem-sucedida.

Se você deseja mover uma chave para uma instância diferente do Redis, você pode executar migrate. Este comando garante que a chave exista na instância de destino antes de excluí-la da instância de origem. Quando você executa migrate, o comando deve incluir os seguintes elementos nesta ordem:

  • O nome do host ou o endereço IP do banco de dados de destino
  • O número da porta do banco de dados de destino
  • O nome da chave que você deseja migrar
  • O número do banco de dados em que você deseja armazenar a chave na instância de destino
  • Um tempo limite, em milissegundos, que define a quantidade máxima de tempo de inatividade de comunicação entre as duas máquinas. Observe que este não é um limite de tempo para a operação, apenas que a operação deve sempre fazer algum nível de progresso dentro do período definido

Para ilustrar:

  • migrate 203.0.113.0 6379 key_1 7 8000

Além disso, o migrate permite as seguintes opções que você pode adicionar após o argumento de tempo limite:

  • COPY: Especifica que a chave não deve ser excluída da instância de origem
  • REPLACE: Especifica que, se a chave já existir no destino, a operação migrate deve excluí-la e substituí-la
  • KEYS: Em vez de fornecer uma chave específica para migrar, você pode inserir uma string vazia ("") e, em seguida, usar a sintaxe do comando keys para migrar qualquer chave que corresponda a um padrão. Para mais informações sobre como funciona o keys, consulte nosso tutorial How To Troubleshoot Issues in Redis.

Gerenciando Chaves

Existem vários comandos Redis que são úteis para gerenciar chaves, independentemente do tipo de dados que elas mantêm. Vamos abordar alguns deles nesta seção.

O rename renomeará a chave especificada. Se for bem sucedido, ele retornará OK:

  • rename old_key new_key

Você pode utilizar o randomkey para retornar uma chave aleatória do banco de dados selecionado no momento:

  • randomkey
Output"any_key" 

Use type para determinar que tipo de dados a chave fornecida contém. A saída deste comando pode ser string, list, hash, set, zset, ou stream:

  • type key_1
Output"string" 

Se a chave especificada não existir, o type retornará none.

Você pode mover uma chave individual para outro banco de dados na sua instância do Redis com o comando move. O move pega o nome de uma chave e o banco de dados para o qual você deseja mover a chave como argumentos. Por exemplo, para mover a chave key_1 para o banco de dados 8, você executaria o seguinte:

  • move key_1 8

move retornará OK se a movimentação da chave foi bem-sucedida.

Excluindo Chaves

Para excluir uma ou mais chaves de qualquer tipo de dados, use o comando del seguido por uma ou mais chaves que você deseja excluir:

  • del key_1 key_2

Se este comando excluir as chaves com êxito, ele retornará (integer) 1. Caso contrário, ele retornará (integer) 0.

O comando unlink executa uma função semelhante a del, com a diferença de que del bloqueia o cliente enquanto o servidor recupera a memória ocupada pela chave. Se a chave que está sendo excluída estiver associada a um objeto pequeno, a quantidade de tempo que leva para o del recuperar a memória é muito pequena e o tempo de bloqueio pode nem ser perceptível.

No entanto, isso pode ser inconveniente se, por exemplo, a chave que você está excluindo estiver associada a muitos objetos, como um hash com milhares ou milhões de campos. A exclusão de uma chave desse tipo pode demorar muito e você não poderá executar outras operações até que seja totalmente removida da memória do servidor.

O unlink, no entanto, primeiro determina o custo de desalocar a memória ocupada pela chave. Se for pequeno, o unlink funciona da mesma maneira que o del para a chave, enquanto também bloqueia o cliente. No entanto, se houver um alto custo para desalocar a memória de uma chave, o unlink excluirá a chave de forma assíncrona, criando outra thread e recuperando progressivamente a memória em segundo plano sem bloquear o cliente:

  • unlink key_1

Como ele é executado em segundo plano, geralmente é recomendável que você use o unlink para remover chaves do seu servidor para reduzir erros em seus clientes, embora o del também seja suficiente em muitos casos.

Atenção: Os dois comandos a seguir são considerados perigosos. Os comandos flushdb e flushall excluirão irreversivelmente todas as chaves em um único banco de dados e todas as chaves em todos os bancos de dados no servidor Redis, respectivamente. Recomendamos que você execute esses comandos apenas se tiver certeza absoluta de que deseja excluir todas as chaves do seu banco de dados ou servidor.

Pode ser do seu interesse renomear esses comandos (veja o Passo 5) para algo com menor probabilidade de ser executado acidentalmente.

Para excluir todas as chaves no banco de dados selecionado, use o comando flushdb:

  • flushdb

Para excluir todas as chaves em todos os bancos de dados em um servidor Redis (incluindo o banco de dados atualmente selecionado), execute flushall:

  • flushall

Ambos flushdb e flushall aceitam a opção async, que lhe permite excluir todas as chaves em um único banco de dados ou todos os bancos de dados no cluster de forma assíncrona. Isso permite que eles funcionem de maneira semelhante ao comando unlink, e eles criarão uma nova thread para liberar incrementalmente a memória em segundo plano.

Fazendo Backup do seu Banco de Dados

Para criar um backup do banco de dados selecionado atualmente, você pode usar o comando save:

  • save

Isso exportará um instantâneo ou snapshot do dataset atual como um arquivo .rdb, que é um arquivo de dump de banco de dados que mantém os dados em um formato interno de serialização compactado.

O save é executado de forma síncrona e bloqueará quaisquer outros clientes conectados ao banco de dados. Portanto, a documentação do comando save recomenda que esse comando quase nunca seja executado em um ambiente de produção. Em vez disso, sugere o uso do comando bgsave. Isso indica ao Redis para fazer um fork do banco de dados: o pai continuará a servir os clientes enquanto o processo filho salva o banco de dados antes de sair:

  • bgsave

Observe que se os clientes adicionarem ou modificarem dados enquanto a operação bgsave estiver ocorrendo, essas alterações não serão capturadas no snapshot.

Você também pode editar o arquivo de configuração do Redis para que o Redis salve um snapshot automaticamente (conhecido como modo snapshotting ou RDB) após um certo período de tempo, se um número mínimo de alterações tiver sido feito no banco de dados. Isso é conhecido como salvar ponto. As seguintes configurações de ponto de salvamento são ativadas por padrão no arquivo redis.conf:

/etc/redis/redis.conf

. . . save 900 1 save 300 10 save 60 10000 . . . dbfilename "nextfile.rdb" . . . 

Com essas configurações, o Redis exportará um snapshot do banco de dados para o arquivo definido pelo parâmetro dbfilename a cada 900 segundos, se pelo menos 1 chave for alterada, a cada 300 segundos, se pelo menos 10 chaves forem alteradas e a cada 60 segundos, se pelo menos 10000 chaves forem alteradas.

Você pode usar o comando shutdown para fazer backup de seus dados do Redis e depois fechar sua conexão. Este comando bloqueará todos os clientes conectados ao banco de dados e executará uma operação save se pelo menos um ponto de salvamento estiver configurado, o que significa que exportará o banco de dados em seu estado atual para um arquivo .rdb, impedindo que os clientes façam quaisquer alterações.

Além disso, o comando shutdown liberará as alterações no arquivo append-only do Redis antes de sair se o modo append-only estiver ativado.O arquivo append-only (AOF) envolve a criação de um log de todas as operações de gravação no servidor em um arquivo que termina em .aof após cada snapshot. Os modos AOF e RDB podem ser ativados no mesmo servidor e o uso dos dois métodos de persistência é uma maneira eficaz de fazer backup de seus dados.

Resumindo, o comando shutdown é essencialmente um comando save bloqueador que também libera todas as alterações recentes no arquivo append-only e fecha a conexão com a instância Redis:

Atenção: O comando shutdown é considerado perigoso. Ao bloquear os clientes do servidor Redis, você pode tornar seus dados indisponíveis para usuários e aplicações que dependem deles. Recomendamos que você execute este comando apenas se estiver testando o comportamento do Redis ou tiver certeza absoluta de que deseja bloquear todos os clientes do seu servidor Redis.

Pode ser do seu interesse renomear esses comandos (veja o Passo 5) para algo com menor probabilidade de ser executado acidentalmente.

  • shutdown

Se você não configurou nenhum ponto de salvamento, mas ainda deseja que o Redis execute uma operação save, acrescente a opção save ao comando shutdown:

  • shutdown save

Se você configurou pelo menos um ponto de salvamento, mas deseja desligar o servidor Redis sem executar um salvamento, é possível adicionar o argumento nosave ao comando:

  • shutdown nosave

Observe que o arquivo append-only pode crescer muito ao longo do tempo, mas você pode configurar o Redis para reescrever o arquivo com base em certas variáveis, editando o arquivo redis.conf. Você também pode instruir o Redis a reescrever o arquivo append-only executando o comando bgrewriteaof:

  • bgrewriteaof

O bgrewriteaof criará o menor conjunto de comandos necessários para trazer o banco de dados de volta ao seu estado atual. Como o nome deste comando implica, ele será executado em segundo plano. No entanto, se outro comando de persistência já estiver sendo executado em um processo em segundo plano, esse comando deverá terminar antes que o Redis execute bgrewriteaof.

Conclusão

Este guia detalha vários comandos usados para gerenciar bancos de dados e chaves. Se houver outros comandos, argumentos ou procedimentos relacionados que você queira ver 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.