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 Accounts
que contém vários índices. É possível consultar um documento que Accounts
contenha 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.Mobile
pode conter uma matriz ou até um sub-documento ( PhoneNumber.Mobile.Work
e 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 = Simon
e armazenará o resultado,, 100
como SET user:Simon:lingots = 100
. Então, quando você atribuir Simon 5 lingots, você leu user:Simon:lingots = 100
, SET user:Simon:lingots = 105
e 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:lingots
sem 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:*:Simon
sair 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.