O Redis mantém os dados?

122

Eu entendo que o Redis fornece todos os dados da memória, mas persiste também durante a reinicialização do servidor para que, quando o servidor for reinicializado, ele leia na memória todos os dados do disco. Ou é sempre um armazenamento em branco que serve apenas para armazenar dados enquanto os aplicativos estão sendo executados sem persistência?

Zuriar
fonte
1
Não tenho certeza se entendi sua pergunta corretamente. Você pode salvar o instantâneo no disco e ler esse arquivo; se não fizer isso, o banco de dados do Redis estará vazio ao reiniciar.
Sefa de

Respostas:

82

Eu sugiro que você leia sobre isso em http://redis.io/topics/persistence . Basicamente, você perde a persistência garantida ao aumentar o desempenho usando apenas o armazenamento na memória. Imagine um cenário em que você faz INSERÇÃO na memória, mas antes de persistir no disco, você perde energia. Haverá perda de dados.

O Redis oferece suporte aos chamados "instantâneos". Isso significa que ele fará uma cópia completa do que está na memória em alguns momentos (por exemplo, a cada hora inteira). Quando você perder energia entre dois instantâneos, perderá os dados do tempo entre o último instantâneo e o travamento (não precisa ser uma queda de energia ..). O Redis negocia a segurança dos dados com o desempenho, como a maioria dos NoSQL-DBs faz.

A maioria dos bancos de dados NoSQL segue um conceito de replicação entre vários nós para minimizar esse risco. O Redis é considerado mais um cache rápido do que um banco de dados que garante a consistência dos dados. Portanto, seus casos de uso normalmente diferem daqueles de bancos de dados reais: você pode, por exemplo, armazenar sessões, contadores de desempenho ou o que quer que seja com desempenho incomparável e sem perda real em caso de falha. Mas processar pedidos / históricos de compras e assim por diante é considerado uma tarefa para bancos de dados tradicionais.

Manuel Arwed Schmidt
fonte
1
Será ótimo se você puder adicionar o comportamento de persistência padrão. Como a resposta de @Leonid Beschastny.
yeya
40

O servidor Redis salva todos os seus dados no HDD de tempos em tempos, fornecendo assim algum nível de persistência.

Ele salva os dados em um dos seguintes casos:

  • automaticamente de vez em quando
  • quando você chama manualmente o BGSAVEcomando
  • quando o redis está fechando

Mas os dados no redis não são realmente persistentes, porque:

  • falha do processo redis significa perder todas as alterações desde o último salvamento
  • BGSAVE operação só pode ser realizada se você tiver RAM livre suficiente (a quantidade de RAM extra é igual ao tamanho do banco de dados redis)

NB: A BGSAVE exigência de RAM é um problema real, porque o redis continua a funcionar até que não haja mais RAM para executar, mas ele para de salvar dados no HDD muito antes (em aproximadamente 50% de RAM).

Para obter mais informações, consulte Persistência do Redis .

Leonid Beschastny
fonte
1
Desde que essa resposta foi escrita, o redis introduziu um modelo de persistência alternativo chamado AOF, que fornece persistência significativamente maior, mas tem algumas outras desvantagens, como maior utilização do disco e inicialização mais lenta do servidor.
Leonid Beschastny
15

É uma questão de configuração. Você pode ter persistência nenhuma, parcial ou total de seus dados no Redis. A melhor decisão será orientada pelas necessidades técnicas e comerciais do projeto.

De acordo com a documentação do Redis sobre persistência, você pode configurar sua instância para salvar dados no disco de vez em quando ou em cada consulta, em poucas palavras. Eles fornecem duas estratégias / métodos AOF e RDB (leia a documentação para ver os detalhes sobre eles), você pode usar cada um sozinho ou em conjunto.

Se você quer uma "persistência como SQL", eles disseram:

A indicação geral é que você deve usar os dois métodos de persistência se quiser um grau de segurança de dados comparável ao que o PostgreSQL pode fornecer.

Adailson De Castro
fonte
7

A resposta geralmente é sim , no entanto, uma resposta mais completa realmente depende do tipo de dados que você está tentando armazenar. Em geral, a resposta curta mais completa é:

  • Redis não é a melhor opção para armazenamento persistente, pois se concentra principalmente no desempenho
  • O Redis é realmente mais adequado para armazenamento / cache confiável na memória de dados do estado atual , especialmente para permitir escalabilidade, fornecendo uma fonte central de dados usados ​​em vários clientes / servidores

Dito isso, por padrão, o Redis irá persistir os instantâneos de dados em um intervalo periódico (aparentemente isso ocorre a cada 1 minuto, mas eu não verifiquei isso - isso é descrito pelo artigo abaixo, que é uma boa introdução básica):

http://qnimate.com/redis-permanent-storage/


TL; DR

Dos documentos oficiais :

  • A persistência RDB [o padrão] realiza instantâneos point-in-time do seu conjunto de dados em intervalos especificados.
  • A persistência AOF [precisa ser explicitamente configurada] registra cada operação de gravação recebida pelo servidor, que será reproduzida novamente na inicialização do servidor, reconstruindo o conjunto de dados original.

O Redis deve ser explicitamente configurado para persistência AOF, se necessário, e isso resultará em uma penalidade de desempenho, bem como em logs de crescimento. Pode ser suficiente para uma persistência relativamente confiável de uma quantidade limitada de fluxo de dados.

Chris Halcrow
fonte
5

Você pode escolher nenhuma persistência. Melhor desempenho, mas todos os dados perdem quando o Redis é encerrado.

O Redis tem dois mecanismos de persistência: RDB e AOF.RDB usa um agendador de snapshooting global e o AOF grava a atualização em um arquivo de log somente anexo semelhante ao MySql.

Você pode usar um deles ou ambos. Quando o Redis é reinicializado, ele cria dados a partir da leitura do arquivo RDB ou AOF.

Songxin
fonte