Quando Redis? Quando MongoDB? [fechadas]

466

O que eu quero não é uma comparação entre Redis e MongoDB. Eu sei que eles são diferentes; o desempenho e a API são totalmente diferentes.

O Redis é muito rápido, mas a API é muito 'atômica'. O MongoDB consumirá mais recursos, mas a API é muito, muito fácil de usar, e estou muito feliz com isso.

Os dois são incríveis, e eu quero usar o Redis na implantação o máximo possível, mas é difícil codificar. Quero usar o MongoDB no desenvolvimento o máximo que puder, mas ele precisa de uma máquina cara.

Então, o que você acha do uso dos dois? Quando escolher Redis? Quando escolher o MongoDB?

culpados 桂林
fonte

Respostas:

308

Eu diria que depende do tipo de equipe de desenvolvimento que você é e da sua aplicação.

Por exemplo, se você precisar de muitas consultas , isso significa que seria mais trabalhoso para os desenvolvedores usar o Redis, onde seus dados podem ser armazenados em diversas estruturas de dados especializadas, personalizadas para cada tipo de objeto, para maior eficiência. No MongoDB, as mesmas consultas podem ser mais fáceis porque a estrutura é mais consistente em seus dados. Por outro lado, em Redis, a grande velocidade da resposta a essas consultas é a recompensa pelo trabalho extra de lidar com a variedade de estruturas com as quais seus dados podem ser armazenados.

O MongoDB oferece simplicidade e curva de aprendizado muito mais curta para desenvolvedores com experiência tradicional em DB e SQL. No entanto, a abordagem não tradicional da Redis exige mais esforço para aprender, mas maior flexibilidade.

Por exemplo. Uma camada de cache provavelmente pode ser melhor implementada no Redis. Para dados mais capazes de esquema, o MongoDB é melhor. [Nota: o MongoDB e o Redis são tecnicamente sem esquema]

Se você me perguntar, minha escolha pessoal é Redis para a maioria dos requisitos.

Por fim, espero que você já tenha visto http://antirez.com/post/MongoDB-and-Redis.html

Shekhar
fonte
16
fyi, mongodb é sem esquema.
Özgür 25/05
18
MogoDB é sem esquema. e conforme os dados armazenados no banco de dados ficam cada vez maiores, o MongoDB prova que é muito mais rápido que o Redis. Redis só é mais rápido quando os dados armazenados são pequenos.
Anderson
4
Adoro a abordagem do MongoDB sem esquema e, em seguida, deixar aos autores do ORM implementar esquemas para aqueles que precisam deles. Mongoose é um grande ORM que esquemas introduz-fáceis de usar se você precisar deles :)
Chev
18
Você deve saber que o tamanho do banco de dados redis é limitado pela quantidade de RAM na máquina. Qualquer um maior que isso e você deve pensar em agrupamentos, que é manual e intensivo.
Akash Agrawal
4
O MongoDB não impor um esquema, mas eu gostaria de ver um caso em que alguém usa-lo sem um esquema ... é tudo como você define a palavra esquema
Robbie Guilfoyle
236

Acabei de perceber que essa pergunta é bastante antiga. No entanto, considero que vale a pena acrescentar os seguintes aspectos:

  • Use o MongoDB se você ainda não sabe como irá consultar seus dados.

    O MongoDB é adequado para Hackathons, startups ou toda vez que você não sabe como consultar os dados inseridos. O MongoDB não faz suposições no seu esquema subjacente. Embora o MongoDB seja sem esquema e não relacional, isso não significa que não exista nenhum esquema. Simplesmente significa que seu esquema precisa ser definido no seu aplicativo (por exemplo, usando o Mongoose). Além disso, o MongoDB é ótimo para criar protótipos ou experimentar coisas. Seu desempenho não é tão bom e não pode ser comparado ao Redis.

  • Use Redis para acelerar seu aplicativo existente.

    Redis podem ser facilmente integrados como um cache LRU . É muito incomum usar o Redis como um sistema de banco de dados independente (algumas pessoas preferem se referir a ele como uma loja de "valor-chave"). Sites como o Craigslist usam Redis ao lado do banco de dados principal . Antirez (desenvolvedor do Redis) demonstrou usando o Lamernews que é realmente possível usar o Redis como um sistema de banco de dados independente.

  • O Redis não faz nenhuma suposição com base em seus dados.

    O Redis fornece várias estruturas de dados úteis (por exemplo, Conjuntos, Hashes, Listas), mas você precisa definir explicitamente como deseja armazenar seus dados. Para resumir, o Redis e o MongoDB podem ser usados ​​para obter coisas semelhantes. Redis é simplesmente mais rápido, mas não é adequado para prototipagem. Esse é um caso de uso em que você normalmente prefere o MongoDB. Além disso, o Redis é realmente flexível. As estruturas de dados subjacentes que ele fornece são os componentes dos sistemas de banco de dados de alto desempenho.

Quando usar o Redis?

  • Armazenamento em cache

    O armazenamento em cache usando o MongoDB simplesmente não faz muito sentido. Seria muito lento.

  • Se você tiver tempo suficiente para pensar no seu design de banco de dados.

    Você não pode simplesmente inserir seus documentos no Redis. Você precisa pensar na maneira como deseja armazenar e organizar seus dados. Um exemplo são os hashes no Redis. Eles são bem diferentes dos objetos aninhados "tradicionais", o que significa que você precisará repensar a maneira como armazena documentos aninhados. Uma solução seria armazenar uma referência dentro do hash para outro hash (algo como chave: [id do segundo hash] ). Outra idéia seria armazená-lo como JSON, o que parece contra-intuitivo para a maioria das pessoas com um background * SQL.

  • Se você precisa realmente de alto desempenho.

    Superar o desempenho que Redis oferece é quase impossível. Imagine seu banco de dados sendo tão rápido quanto seu cache. É assim que se sente ao usar o Redis como um banco de dados real .

  • Se você não se importa que muito sobre escala.

    Redimensionar redis não é tão difícil quanto costumava ser. Por exemplo, você pode usar um tipo de servidor proxy para distribuir os dados entre várias instâncias do Redis. Replicação mestre-escravo não é que complicado, mas distribuindo-lhe as chaves entre múltiplas necessidades Redis-instances para ser feito no local de aplicação (por exemplo, usando uma função de hash, Modulo etc.). Escalar o MongoDB por comparação é muito mais simples.

Quando usar o MongoDB

  • Prototipagem, Startups, Hackathons

    O MongoDB é perfeitamente adequado para prototipagem rápida. No entanto, o desempenho não é tão bom. Lembre-se também de que você provavelmente precisará definir algum tipo de esquema no seu aplicativo.

  • Quando você precisar alterar seu esquema rapidamente.

    Porque não há esquema! Alterar tabelas no DBMS relacional tradicional é muito caro e lento. O MongoDB resolve esse problema, não fazendo muitas suposições sobre os dados subjacentes. No entanto, ele tenta otimizar o máximo possível sem exigir que você defina um esquema.

TL; DR - Use Redis se o desempenho for importante e você estiver disposto a gastar tempo otimizando e organizando seus dados. - Use o MongoDB se precisar criar um protótipo sem se preocupar muito com o seu banco de dados.

Leitura adicional:

Alexander Gugel
fonte
3
Se você tiver tempo suficiente para pensar no seu design de banco de dados. Para realizá-lo: suponha que você queira armazenar dados SO. Em Mongo : Simplesmente despejar as perguntas completas com respostas aninhadas e comentários, mas em Redis você tem que fazer o seguinte: SO on redis
Abhishek Gupta
223

Redis. Digamos que você tenha escrito um site em php; por qualquer motivo, torna-se popular e está à frente de seu tempo ou possui porno. Você percebe que esse php é muito lento: "Vou perder meus fãs porque eles simplesmente não esperam 10 segundos por uma página". Você percebe repentinamente que uma página da Web tem um URL constante (nunca muda, uau), uma chave primária, se desejar, e depois se lembra que a memória é rápida enquanto o disco é lento e o php é ainda mais lento. :( Então você cria um mecanismo de armazenamento usando a memória e esse URL que chama de "chave" enquanto o conteúdo da página da Web que você decide chamar de "valor". Isso é tudo que você tem - chave e conteúdo. Você o chama de "cache de memes". Você gosta de Richard Dawkins, porque ele é incrível, você armazena em cache seu html, como esquilos, em cache, e não precisa reescrever seu código php de baixa qualidade. Vocês estão felizes. Então você vê que outros fizeram isso - mas você escolhe Redis porque o outro tem imagens confusas de gatos, alguns com presas.

Mongo. Você escreveu um site. Heck você escreveu muitos, e em qualquer idioma. Você percebe que muito do seu tempo é gasto escrevendo essas cláusulas fedorentas do SQL. Você não é um dba, ainda assim está, escrevendo declarações sql estúpidas ... não apenas uma, mas em todo lugar. "selecione isto, selecione aquilo". Mas em particular você se lembra da irritante cláusula WHERE. Onde o sobrenome é igual a "thornton" e o filme é igual a "bad santa". Urgh. Você pensa: "por que esses dbas simplesmente não fazem seu trabalho e me fornecem alguns procedimentos armazenados?" Então você esquece alguns campos menores, como o nome do meio, e então você precisa soltar a tabela, exportar todos os 10G de big data e criar outro com esse novo campo e importar os dados - e isso ocorre 10 vezes durante os próximos 14 dias, conforme você continue lembrando porcaria como saudação, título, além de adicionar uma chave estrangeira com endereços. Então você acha que esse sobrenome deve ser lastName. Quase uma mudança por dia. Então você diz danado. Eu tenho que entrar e escrever um site / sistema, não importa esse modelo de dados bs. Então você pesquisa no Google: "Eu odeio escrever SQL, por favor, não SQL, faça com que pare", mas aparece o 'nosql' e você lê algumas coisas e ele diz que apenas despeja dados sem nenhum esquema. Você se lembra do fiasco da semana passada derrubando mais mesas e sorrindo. Então você escolhe o mongo porque alguns caras grandes, como 'airbud', o site de aluguel do apt o usam. Doce. Não há mais alterações no modelo de dados porque você tem um modelo que continua mudando.

Gabe Rainbow
fonte
o que você quer dizer com You don't need to rewrite your crap php code?como a kv store resolve isso? :)
Roy Lee
13
@ Roylee, ele quer dizer que o php lento e de baixa qualidade gera uma página da Web em html. Em vez de reescrever laboriosamente o código para torná-lo mais rápido / eficiente, você executa o php uma vez no início e depois para sempre, apenas lembre-se da página da Web pré-criada em html usando sua loja kv.
50516 Mikepote
A maneira como você contou essa história me ajudou a finalmente conceituar por que o esquema é menos impressionante! Apenas me salvou alguns anos de ter que lidar com o SQL para entender o poder.
Nick Pineda
4
'Não há mais alterações de modelo' não captura verdadeiramente a situação. A menos que você escreva um código de movimento de dados para atualizar todas as suas entradas existentes, é mais como se você tivesse 'N' modelos ligeiramente diferentes, todos vivendo no mesmo banco de dados ao mesmo tempo, e o código precise descobrir com qual modelo ele está lidando quando lê algo do banco de dados.
Terry Coatta 5/03/16
2
Uma das melhores respostas absolutas que eu já vi. Ele tem grande conteúdo e realmente me fazendo rir em voz alta (literalmente não lol)
colbyJax
16

Talvez esse recurso seja útil para ajudar a decidir entre os dois. Ele também discute vários outros bancos de dados NoSQL e oferece uma pequena lista de características, juntamente com uma explicação "para o que eu usaria" para cada um deles.

http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

stackex
fonte
11

Pergunta difícil de responder - como na maioria das soluções de tecnologia, isso realmente depende da sua situação e, como você não descreveu o problema que está tentando resolver, como alguém pode propor uma solução?

Você precisa testá-los para ver qual deles atendeu às suas necessidades.

Com isso dito, o MongoDB não requer nenhum hardware caro. Como qualquer outra solução de banco de dados, ele funcionará melhor com mais CPU e memória, mas certamente não é um requisito - especialmente para fins de desenvolvimento inicial.

Bryan Migliorisi
fonte
10

O Redis é um armazenamento de dados na memória , que pode persistir no estado em disco (para ativar a recuperação após a reinicialização). No entanto, ser um armazenamento de dados na memória significa que o tamanho do armazenamento de dados (em um único nó) não pode exceder o espaço total de memória no sistema (RAM física + espaço de troca). Na realidade, será muito menos isso, pois a Redis está compartilhando esse espaço com muitos outros processos no sistema e, se esgotar o espaço de memória do sistema, provavelmente será eliminada pelo sistema operacional.

O Mongo é um armazenamento de dados baseado em disco , mais eficiente quando o conjunto de trabalho se encaixa na RAM física (como todos os softwares). Ser um dado baseado em disco significa que não há limites intrínsecos ao tamanho de um banco de dados Mongo; no entanto, opções de configuração, espaço em disco disponível e outras preocupações podem significar que tamanhos de bancos de dados acima de um determinado limite podem se tornar impraticáveis ​​ou ineficientes.

Redis e Mongo podem ser agrupados para alta disponibilidade, backup e para aumentar o tamanho geral do armazenamento de dados.

aaa90210
fonte
10

Todas as respostas (no momento da redação deste artigo) assumem que cada um dos Redis, MongoDB e talvez um banco de dados relacional baseado em SQL são essencialmente a mesma ferramenta: "armazenar dados". Eles não consideram modelos de dados.

MongoDB: Dados Complexos

O MongoDB é um repositório de documentos. Para comparar com um banco de dados relacional orientado a SQL: os bancos de dados relacionais simplificam os arquivos CSV indexados, cada arquivo sendo uma tabela; os armazenamentos de documentos simplificam os arquivos JSON indexados, cada arquivo sendo um documento, com vários arquivos agrupados.

Os arquivos JSON têm estrutura semelhante aos arquivos XML e YAML e aos dicionários, como no Python; portanto, pense nos seus dados nesse tipo de hierarquia. Ao indexar, a estrutura é a chave: um documento contém chaves nomeadas, que contêm outros documentos, matrizes ou valores escalares. Considere o documento abaixo.

{
  _id:  0x194f38dc491a,
  Name:  "John Smith",
  PhoneNumber:
    Home: "555 999-1234",
    Work: "555 999-9876",
    Mobile: "555 634-5789"
  Accounts:
    - "379-1111"
    - "379-2574"
    - "414-6731"
}

O documento acima possui uma chave PhoneNumber.Mobile, que possui valor 555 634-5789. Você pode pesquisar uma coleção de documentos em que a chave PhoneNumber.Mobile, tem algum valor; eles são indexados.

Ele também possui uma matriz Accountsque contém vários índices. É possível consultar um documento que Accountscontenha exatamente algum subconjunto de valores, todos os subconjuntos de valores ou qualquer subconjunto de valores. Isso significa que você pode procurar Accounts = ["379-1111", "379-2574"]e não encontrar o acima; você pode procurar Accounts includes ["379-1111"]e encontrar o documento acima; e você pode procurar Accounts includes any of ["974-3785","414-6731"]e encontrar o documento acima e qualquer documento que inclua a conta "974-3785", se houver.

Os documentos são tão profundos quanto você deseja. PhoneNumber.Mobilepode conter uma matriz ou até um sub-documento ( PhoneNumber.Mobile.Worke PhoneNumber.Mobile.Personal). Se seus dados são altamente estruturados, os documentos são um grande passo em relação aos bancos de dados relacionais.

Se seus dados são na sua maioria planos, relacionais e rigidamente estruturados, é melhor ter um banco de dados relacional. Novamente, o grande sinal é se seus modelos de dados são melhores para uma coleção de arquivos CSV inter-relacionados ou para uma coleção de arquivos XML / JSON / YAML.

Para a maioria dos projetos, você precisará se comprometer, aceitando uma solução alternativa em algumas áreas pequenas onde o SQL ou o Document Stores não se encaixam; para alguns projetos grandes e complexos que armazenam uma ampla variedade de dados (muitas colunas; linhas são irrelevantes), faz sentido armazenar alguns dados em um modelo e outros dados em outro modelo. O Facebook usa o SQL e um banco de dados gráfico (onde os dados são colocados em nós e os nós são conectados a outros nós); O Craigslist costumava usar MySQL e MongoDB, mas estava pensando em mudar completamente para o MongoDB. São lugares em que a extensão e o relacionamento dos dados enfrentam desvantagens significativas se colocados sob um modelo.

Redis: valor-chave

Redis é, basicamente, um armazenamento de valores-chave. O Redis permite que você dê uma chave e procure um único valor. O próprio Redis pode armazenar strings, listas, hashes e algumas outras coisas; no entanto, ele apenas procura pelo nome.

A invalidação de cache é um dos problemas difíceis da ciência da computação; o outro está nomeando coisas. Isso significa que você usará o Redis quando quiser evitar centenas de excesso de pesquisas para um back-end, mas precisará descobrir quando precisa de uma nova pesquisa.

O caso mais óbvio de invalidação é a atualização na gravação: se você ler user:Simon:lingots = NOTFOUND, poderá SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simone armazenará o resultado,, 100como SET user:Simon:lingots = 100. Então, quando você atribuir Simon 5 lingots, você leu user:Simon:lingots = 100, SET user:Simon:lingots = 105e UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon. Agora você tem 105 no seu banco de dados e no Redis e pode obtê-lo user:Simon:lingotssem consultar o banco de dados.

O segundo caso é atualizar informações dependentes. Digamos que você gere pedaços de uma página e armazene em cache a saída deles. O cabeçalho mostra a experiência, nível e quantidade de dinheiro do jogador; a página de perfil do jogador tem um bloco que mostra suas estatísticas; e assim por diante. O jogador ganha alguma experiência. Bem, agora você tem vários templates:Header:Simon, templates:StatsBox:Simon, templates:GrowthGraph:Simon, e assim por diante campos onde você em cache a saída de um banco de dados de meia dúzia de consultas executado através de um modelo de motor. Normalmente, quando você exibe essas páginas, diz:

$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
  $t = BuildTemplate("StatsBox.tmpl",
                     GetStatsFromDatabase($playerName));
  SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;

Como você acabou de atualizar os resultados GetStatsFromDatabase("Simon"), precisará templates:*:Simonsair do cache de valores-chave. Quando você tenta renderizar qualquer um desses modelos, seu aplicativo agita a busca de dados do seu banco de dados (PostgreSQL, MongoDB) e os insere no seu modelo; em seguida, ele armazenará o resultado no Redis e, esperançosamente, não se preocupará em fazer consultas ao banco de dados e renderizar modelos na próxima vez que exibir esse bloco de saída.

O Redis também permite fazer filas de mensagens de assinatura do editor e coisas do tipo. Esse é outro tópico inteiramente. O ponto aqui é que o Redis é um cache de valor-chave, que difere de um banco de dados relacional ou de um repositório de documentos.

Conclusão

Escolha suas ferramentas com base em suas necessidades. A maior necessidade é geralmente o modelo de dados, pois isso determina o quão complexo e propenso a erros é o seu código. Aplicativos especializados dependerão do desempenho, locais onde você escreve tudo em uma mistura de C e Assembly; a maioria dos aplicativos trata apenas do caso generalizado e usa um sistema de cache como Redis ou Memcached, que é muito mais rápido que um banco de dados SQL de alto desempenho ou um repositório de documentos.

John Moser
fonte
2
"A invalidação do cache é um dos problemas difíceis da ciência da computação; o outro é nomear coisas". Tão verdade!
Arel
2

E você não deve usá-lo se tiver bastante RAM. Redis e MongoDB custam uma ferramenta de uso geral. Isso introduz muita sobrecarga.

Dizia-se que Redis é 10 vezes mais rápido que Mongo. Isso pode não ser mais verdade. O MongoDB (se bem me lembro) afirmou ter batido o memcache por armazenar e armazenar em cache documentos, desde que as configurações de memória sejam as mesmas.

De qualquer forma. Redis bom, MongoDB é bom. Se você se preocupa com subestruturas e precisa de agregação, vá para o MongoDB. Se o armazenamento de chaves e valores é sua principal preocupação, é tudo sobre o Redis. (ou qualquer outro armazenamento de valores-chave).

Martin Kersten
fonte
2

Redis e MongoDB são bancos de dados não relacionais, mas são de categorias diferentes.

O Redis é um banco de dados de Chave / Valor e está usando armazenamento na memória, o que o torna super rápido. É um bom candidato para armazenar coisas em cache e armazenamento temporário de dados (na memória) e, como a maioria das plataformas em nuvem (como Azure, AWS) o suporta, seu uso de memória é escalável. recursos limitados, considere o uso de memória.

O MongoDB, por outro lado, é um banco de dados de documentos. É uma boa opção para manter textos grandes, imagens, vídeos, etc. e quase tudo que você faz com bancos de dados, exceto transações. Por exemplo, se você deseja desenvolver um blog ou rede social, o MongoDB é uma escolha adequada. É escalável com estratégia de expansão. Ele usa o disco como mídia de armazenamento, para que os dados sejam mantidos.

akazemis
fonte
1

Se o seu projeto foi alterado, você pode ter memória RAM suficiente no seu ambiente - a resposta é Redis. Especialmente considerando o novo Redis 3.2 com funcionalidade de cluster.

Denys
fonte