Resumo (TL; DR)
Atualizado 3 de junho de 2017
O Redis é mais poderoso, mais popular e com melhor suporte do que o memcached. O Memcached pode fazer apenas uma pequena fração do que os Redis podem fazer. Redis é melhor mesmo quando seus recursos se sobrepõem.
Para algo novo, use Redis.
Memcached vs Redis: Comparação Direta
Ambas as ferramentas são poderosas, rápidas, armazenamentos de dados na memória, úteis como cache. Ambos podem ajudar a acelerar seu aplicativo, armazenando em cache os resultados do banco de dados, fragmentos de HTML ou qualquer outra coisa que possa ser cara de gerar.
Pontos a considerar
Quando usado para a mesma coisa, eis como eles se comparam usando os "Pontos a considerar" da pergunta original:
- Velocidade de leitura / gravação : ambos são extremamente rápidos. Os benchmarks variam de acordo com a carga de trabalho, as versões e muitos outros fatores, mas geralmente mostram que os redis são tão rápidos ou quase tão rápidos quanto o cache de memórias. Eu recomendo redis, mas não porque o memcached é lento. Não é.
- Uso de memória : Redis é melhor.
- memcached: Você especifica o tamanho do cache e, ao inserir itens, o daemon aumenta rapidamente para um pouco mais que esse tamanho. Nunca existe realmente uma maneira de recuperar esse espaço, antes de reiniciar o memcached. Todas as suas chaves podem expirar, você pode liberar o banco de dados e ele ainda usaria toda a parte da RAM com a qual o configurou.
- redis: A definição de um tamanho máximo depende de você. O Redis nunca usará mais do que o necessário e devolverá a memória que não está mais sendo usada.
- Armazenei 100.000 ~ 2KB (~ 200MB) de frases aleatórias em ambos. O uso de RAM do Memcached aumentou para ~ 225MB. O uso de RAM Redis aumentou para ~ 228MB. Após liberar os dois, os redis caíram para ~ 29MB e o memcached permaneceu em ~ 225MB. Eles são igualmente eficientes na maneira como armazenam dados, mas apenas um é capaz de recuperá-los.
- Despejo de E / S de disco : uma vitória clara para redis, pois faz isso por padrão e possui persistência muito configurável. O Memcached não possui mecanismos para despejar no disco sem ferramentas de terceiros.
- Escalonamento : ambos oferecem muito espaço para que você precise mais do que uma única instância como cache. O Redis inclui ferramentas para ajudá-lo a ir além, enquanto o memcached não.
memcached
Memcached é um servidor de cache volátil simples. Ele permite que você armazene pares de chave / valor em que o valor está limitado a ser uma string de até 1 MB.
É bom nisso, mas é tudo o que faz. Você pode acessar esses valores por sua chave em velocidade extremamente alta, saturando frequentemente a rede disponível ou mesmo a largura de banda da memória.
Quando você reinicia o memcached, seus dados desaparecem. Isso é bom para um cache. Você não deve guardar nada importante lá.
Se você precisar de alto desempenho ou alta disponibilidade, existem ferramentas, produtos e serviços de terceiros disponíveis.
redis
Os Redis podem fazer os mesmos trabalhos que o memcached, e podem fazê-los melhor.
Redis também podem atuar como cache . Também pode armazenar pares de chave / valor. Em redis, eles podem até ter 512 MB.
Você pode desativar a persistência e, felizmente, ele também perderá seus dados na reinicialização. Se você deseja que seu cache sobreviva, ele também será feito. De fato, esse é o padrão.
Também é super rápido, geralmente limitado pela largura de banda da rede ou da memória.
Se uma instância de redis / memcached não tiver desempenho suficiente para sua carga de trabalho, redis é a escolha certa. O Redis inclui suporte para cluster e vem com ferramentas de alta disponibilidade ( redis-sentinel ) diretamente "na caixa". Nos últimos anos, os redis também surgiram como líderes claros em ferramentas de terceiros. Empresas como Redis Labs, Amazon e outras oferecem muitas ferramentas e serviços redis úteis. O ecossistema ao redor dos redis é muito maior. O número de implantações em larga escala agora é provavelmente maior do que no memcached.
O Redis Superset
Redis é mais que um cache. É um servidor de estrutura de dados na memória. Abaixo, você encontrará uma visão geral rápida do que o Redis pode fazer além de ser um simples cache de chave / valor, como o memcached. A maioria dos recursos dos redis são coisas que o memcached não pode fazer.
Documentação
Redis é melhor documentado do que o memcached. Embora isso possa ser subjetivo, parece ser cada vez mais verdadeiro o tempo todo.
redis.io é um recurso fantástico e fácil de navegar. Ele permite que você tente redis no navegador e até oferece exemplos interativos ao vivo com cada comando nos documentos.
Agora, existem 2x mais resultados de fluxo de pilha para redis que memcached. 2x mais resultados do Google. Exemplos mais facilmente acessíveis em mais idiomas. Desenvolvimento mais ativo. Desenvolvimento de cliente mais ativo. Essas medidas podem não significar muito individualmente, mas em conjunto elas pintam uma imagem clara de que o suporte e a documentação para redis são maiores e muito mais atualizados.
Por padrão, o redis persiste seus dados no disco usando um mecanismo chamado captura instantânea. Se você tiver RAM suficiente disponível, poderá gravar todos os seus dados em disco com quase nenhuma degradação no desempenho. É quase grátis!
No modo instantâneo, há uma chance de que uma falha repentina possa resultar em uma pequena quantidade de dados perdidos. Se você absolutamente precisar garantir que nenhum dado seja perdido, não se preocupe, o redis também estará lá com o modo AOF (Append Only File). Nesse modo de persistência, os dados podem ser sincronizados com o disco conforme são gravados. Isso pode reduzir o rendimento máximo da gravação para o quão rápido o disco pode gravar, mas ainda assim deve ser bastante rápido.
Existem muitas opções de configuração para ajustar a persistência, se necessário, mas os padrões são muito sensíveis. Essas opções facilitam a configuração do redis como um local seguro e redundante para armazenar dados. É um banco de dados real .
Muitos tipos de dados
O Memcached é limitado a strings, mas o Redis é um servidor de estrutura de dados que pode servir muitos tipos de dados diferentes. Ele também fornece os comandos necessários para aproveitar ao máximo esses tipos de dados.
Texto simples ou valores binários que podem ter até 512 MB de tamanho. Esse é o único tipo de dado redis e compartilhamento de cache de memcached, embora as strings de cache de memcached sejam limitadas a 1 MB.
O Redis oferece mais ferramentas para alavancar esse tipo de dados, oferecendo comandos para operações bit a bit, manipulação no nível de bit, suporte a incremento / decremento de ponto flutuante, consultas de intervalo e operações com várias teclas. Memcached não suporta nada disso.
Strings são úteis para todos os tipos de casos de uso, e é por isso que o memcached é bastante útil apenas com esse tipo de dados.
Hashes são como um armazenamento de valores-chave dentro de um armazenamento de valores-chave. Eles mapeiam entre campos de string e valores de string. Os mapas de campo-> valor usando um hash são um pouco mais eficientes em espaço do que os mapas de chave-> valor usando seqüências regulares.
Hashes são úteis como um espaço para nome ou quando você deseja agrupar logicamente muitas chaves. Com um hash, você pode pegar todos os membros com eficiência, expirar todos os membros juntos, excluir todos os membros juntos, etc. Ótimo para qualquer caso de uso em que você tenha vários pares de chave / valor que precisam ser agrupados.
Um exemplo de uso de um hash é para armazenar perfis de usuário entre aplicativos. Um hash redis armazenado com o ID do usuário como a chave permitirá armazenar quantos bits de dados sobre um usuário forem necessários, mantendo-os armazenados em uma única chave. A vantagem de usar um hash em vez de serializar o perfil em uma sequência é que você pode ter aplicativos diferentes lendo / gravando campos diferentes no perfil do usuário sem ter que se preocupar com a substituição de um aplicativo pelas alterações feitas por outros (o que pode acontecer se você serializar obsoleto) dados).
As listas Redis são coleções ordenadas de strings. Eles são otimizados para inserir, ler ou remover valores da parte superior ou inferior (também conhecida como esquerda ou direita) da lista.
O Redis fornece muitos comandos para alavancar listas, incluindo comandos para empurrar / pop itens, push / pop entre listas, truncar listas, executar consultas de intervalo etc.
As listas criam ótimas filas atômicas e duráveis. Eles funcionam muito bem para filas de trabalhos, logs, buffers e muitos outros casos de uso.
Conjuntos são coleções não ordenadas de valores exclusivos. Eles são otimizados para permitir que você verifique rapidamente se um valor está no conjunto, adicione / remova valores rapidamente e avalie a sobreposição com outros conjuntos.
Isso é ótimo para coisas como listas de controle de acesso, rastreadores de visitantes únicos e muitas outras coisas. A maioria das linguagens de programação tem algo semelhante (geralmente chamado de conjunto). É assim, apenas distribuído.
O Redis fornece vários comandos para gerenciar conjuntos. Óbvios como adicionar, remover e verificar o conjunto estão presentes. Assim, comandos menos óbvios, como abrir / ler um item aleatório e comandos para executar uniões e cruzamentos com outros conjuntos.
Conjuntos classificados ( comandos )
Conjuntos classificados também são coleções de valores exclusivos. Estes, como o nome indica, são ordenados. Eles são ordenados por uma pontuação e, em seguida, lexicograficamente.
Esse tipo de dados é otimizado para pesquisas rápidas por pontuação. Obter o maior, o menor ou qualquer intervalo de valores entre eles é extremamente rápido.
Se você adicionar usuários a um conjunto classificado, juntamente com a pontuação mais alta, terá um quadro de líderes perfeito. Quando novas pontuações mais altas chegarem, basta adicioná-las ao conjunto novamente com as pontuações mais altas e ele reordenará seu quadro de líderes. Também é excelente para acompanhar a última vez que os usuários visitaram e quem está ativo no seu aplicativo.
Armazenar valores com a mesma pontuação faz com que sejam ordenados lexicograficamente (pense em ordem alfabética). Isso pode ser útil para coisas como recursos de preenchimento automático.
Muitos dos comandos de conjunto classificados são semelhantes aos comandos de conjuntos, às vezes com um parâmetro de pontuação adicional. Também estão incluídos comandos para gerenciar pontuações e consultas por pontuação.
Geo
O Redis possui vários comandos para armazenar, recuperar e medir dados geográficos. Isso inclui consultas de raio e medição de distâncias entre pontos.
Tecnicamente, os dados geográficos em redis são armazenados em conjuntos classificados, portanto, esse não é um tipo de dados verdadeiramente separado. É mais uma extensão em cima de conjuntos classificados.
Bitmap e HyperLogLog
Como geográfico, esses não são tipos de dados completamente separados. Estes são comandos que permitem tratar dados de sequência como se fosse um bitmap ou um hiperloglog.
Os bitmaps são para o que servem os operadores de nível de bit mencionados abaixo Strings
. Esse tipo de dado foi o alicerce básico do recente projeto de arte colaborativa do reddit: r / Place .
O HyperLogLog permite que você use uma quantidade extremamente pequena constante de espaço para contar valores únicos quase ilimitados com precisão chocante. Usando apenas ~ 16 KB, você pode contar com eficiência o número de visitantes únicos do seu site, mesmo que esse número esteja na casa dos milhões.
Transações e Atomicidade
Os comandos no redis são atômicos, o que significa que, assim que você escreve um valor no redis, esse valor fica visível para todos os clientes conectados ao redis. Não há espera para esse valor se propagar. Tecnicamente, o memcached também é atômico, mas com o redis adicionando toda essa funcionalidade além do memcached, vale a pena notar e de certa forma impressionante que todos esses tipos de dados e recursos adicionais também sejam atômicos.
Embora não seja exatamente o mesmo que transações em bancos de dados relacionais, o redis também possui transações que usam "bloqueio otimista" ( WATCH / MULTI / EXEC ).
Pipelining
O Redis fornece um recurso chamado ' pipelining '. Se você tiver muitos comandos redis que deseja executar, poderá usar o pipelining para enviá-los para o redis todos de uma vez, em vez de um de cada vez.
Normalmente, quando você executa um comando para redis ou memcached, cada comando é um ciclo de solicitação / resposta separado. Com o pipelining, os redis podem armazenar em buffer vários comandos e executá-los todos de uma vez, respondendo com todas as respostas a todos os seus comandos em uma única resposta.
Isso pode permitir uma taxa de transferência ainda maior na importação em massa ou em outras ações que envolvem muitos comandos.
Pub / Sub
O Redis possui comandos dedicados à funcionalidade pub / sub , permitindo que o redis atue como um transmissor de mensagens de alta velocidade. Isso permite que um único cliente publique mensagens para muitos outros clientes conectados a um canal.
Redis faz pub / sub, bem como quase qualquer ferramenta. Os agentes de mensagens dedicados, como o RabbitMQ, podem ter vantagens em determinadas áreas, mas, como o mesmo servidor também pode oferecer filas duráveis e persistentes e outras estruturas de dados de que as cargas de trabalho de pub / sub provavelmente precisam, o Redis geralmente se mostra a melhor e mais simples ferramenta para o trabalho.
Script de Lua
Você pode pensar em scripts lua como o próprio SQL do redis ou procedimentos armazenados. É mais e menos que isso, mas a analogia funciona principalmente.
Talvez você tenha cálculos complexos que deseja que os redis realizem. Talvez você não possa se dar ao luxo de reverter suas transações e precisar de garantias de que todas as etapas de um processo complexo ocorrerão atomicamente. Esses problemas e muitos mais podem ser resolvidos com o script lua.
O script inteiro é executado atomicamente; portanto, se você pode ajustar sua lógica em um script lua, geralmente evita mexer com transações de bloqueio otimistas.
Dimensionamento
Como mencionado acima, o redis inclui suporte interno para cluster e é fornecido com sua própria ferramenta de alta disponibilidade chamada redis-sentinel
.
Conclusão
Sem hesitação, eu recomendaria o remarcação sobre o memcached para novos projetos ou projetos existentes que ainda não usam o memcached.
O exemplo acima pode parecer que eu não gosto do memcached. Pelo contrário: é uma ferramenta poderosa, simples, estável, madura e reforçada. Existem até alguns casos de uso em que é um pouco mais rápido que o redis. Eu amo memcached. Só acho que não faz muito sentido para o desenvolvimento futuro.
O Redis faz tudo que o memcached faz, geralmente melhor. Qualquer vantagem de desempenho para o memcached é pequena e específica da carga de trabalho. Também existem cargas de trabalho para as quais os redis serão mais rápidos, e muitas mais cargas de trabalho que os redis podem fazer e quais os memcached simplesmente não podem. As pequenas diferenças de desempenho parecem mínimas diante do gigantesco abismo de funcionalidade e o fato de que as duas ferramentas são tão rápidas e eficientes que podem muito bem ser a última parte da sua infraestrutura que você precisará se preocupar com o dimensionamento.
Há apenas um cenário em que o memcached faz mais sentido: onde o memcached já está sendo usado como cache. Se você já está armazenando em cache o memcached, continue usando-o, se ele atender às suas necessidades. Provavelmente, não vale a pena o esforço de mudar para redis e, se você usar redis apenas para armazenar em cache, pode não oferecer benefícios suficientes para valer o seu tempo. Se o memcached não estiver atendendo às suas necessidades, provavelmente você deve mudar para redis. Isso é verdade se você precisa ir além do memcached ou se precisa de funcionalidade adicional.