Memcached vs. Redis?

1466

Estamos usando um aplicativo da web Ruby com servidor Redis para armazenamento em cache. Existe um ponto para testar o Memcached ?

O que nos dará um melhor desempenho? Quaisquer prós ou contras entre Redis e Memcached?

Pontos a considerar:

  • Velocidade de leitura / gravação.
  • Uso de memória.
  • Despejo de E / S de disco.
  • Dimensionamento.
Sagiv Ofek
fonte
38
Outra análise, além dos comentários abaixo: Google Trends: redis vs. memcached
MarkHu 27/03
3
Um comentário que não garante resposta: se você estiver procurando serviços baseados em nuvem para esses dois sistemas (por exemplo, addons heroku), os serviços Memcached às vezes são um pouco mais baratos por MB, por qualquer motivo.
Ben Roberts
2
Para escalabilidade: Imgur e Twitter usar tanto
the_red_baron

Respostas:

2105

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.

Persistência

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.

Strings ( comandos )

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 ( comandos )

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).

Listas ( comandos )

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 ( comandos )

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.

Carl Zulauf
fonte
11
Como o Memcached oferece clustering de uma maneira que existe no próprio servidor? Eu sempre usei bibliotecas que distribuíam para um pool de servidores em cache, usando algoritmos de hash ou um módulo. O mesmo é dito para Redis. Eu uso principalmente Python e parece haver alguns módulos que não dependem da biblioteca do memcached para manipular pools de conexões.
Whardier
2
"Transações com bloqueio otimista (WATCH / MULTI / EXEC)" - O Redis não tem transações corretas. Ou seja, se [multi, cmd1, cmd2, cmd3 (exceção), exec], então cmd1 e cmd2 serão executados.
21813 Oleg
10
@ Oleg que não é realmente verdade. Se você usar multi-exec, os comandos serão armazenados em buffer (por exemplo: não executados) até que o exec ocorra; portanto, se você tiver uma exceção antes do exec, nenhum comando será realmente executado. Se exec é chamado, todos os comandos em buffer são executados atomicamente, a menos que, é claro, uma variável de observação tenha sido alterada desde que multi foi chamado pela primeira vez. Este último mecanismo é a parte de bloqueio otimista.
precisa
3
@ Hardhard Você está correto. Resposta atualizada para refletir que o "suporte" do cluster do memcached é ativado por ferramentas adicionais. Deveria ter pesquisado isso melhor.
22813 Carl Zulauf
3
e quanto a clustering com o servidor couchbase? (memcached compatível)
Ken Liu
142

Use Redis se

  1. Você precisa excluir / expirar seletivamente itens no cache. (Você precisa disso)

  2. Você precisa da capacidade de consultar chaves de um tipo específico. eq. 'blog1: posts: *', 'blog2: categorias: xyz: posts: *'. Oh sim! isto é muito importante. Use isso para invalidar seletivamente certos tipos de itens em cache. Você também pode usar isso para invalidar o cache de fragmentos, o cache de páginas, apenas os objetos AR de um determinado tipo, etc.

  3. Persistência (você também precisará disso, a menos que esteja bem com o cache que precisa ser aquecido após cada reinicialização. Muito essencial para objetos que raramente mudam)

Use memcached se

  1. Memcached dá-lhe a cabeça!
  2. umm ... agrupamento? meh. se você for tão longe, use Varnish e Redis para armazenar em cache fragmentos e objetos de AR.

Pela minha experiência, tive uma estabilidade muito melhor com Redis do que com Memcached

SMathew
fonte
7
A documentação do Redis diz que o uso de padrões requer uma verificação de tabela. blog1: posts: * pode exigir uma verificação da tabela O (N). Obviamente, ainda é rápido em conjuntos de dados de tamanho razoável, já que o Redis é rápido. Deve estar OK para teste ou administrador.
Wisty
182
Headached é uma piada, certo? :-) Pesquisei no headcache do memcached, mas não achei nada razoável. (Eu sou novo para Memcached e Redis)
KajMagnus
11
votou pelo mesmo motivo que @pellucide. Redis pode ser melhor que o Memcached, mas o Memcached é fácil de usar. Eu nunca tive um problema com isso e é trivial de configurar.
Diego Jancic 30/07/2015
5
Obrigado @KajMagnus para fazer o meu dia .. possivelmente toda a minha semana 😂
alex
@DiegoJancic Redis é uma das tecnologias mais fáceis de usar. Sem nenhum conhecimento prévio sobre o Redis, levei apenas 20 minutos para instalá-lo no Ubuntu usando um gerenciador de pacotes na nuvem e começar a fazer consultas simples. 4 horas depois, eu poderia realizar cenários mais complexos de POC com inserções em lote usando o script Lua e escolhendo a biblioteca Java (NIO) certa para melhorar o desempenho. Não consigo imaginar nada mais amigável e simples de usar que o Redis.
Moose on the Loose
105

Memcached é multithread e rápido.

O Redis possui muitos recursos e é muito rápido, mas completamente limitado a um núcleo, pois é baseado em um loop de eventos.

Nós usamos os dois. O Memcached é usado para armazenar objetos em cache, reduzindo principalmente a carga de leitura nos bancos de dados. O Redis é usado para coisas como conjuntos ordenados, úteis para acumular dados de séries temporais.

W. Andrew Loe III
fonte
2
Sites de alto tráfego que são fortemente investidos em gargalos db memcached e tem no "perfil do usuário" -como dados não-relacionais deve avaliar Couchbase em paralelo com o habitual Mongo, Redis
2
@siliconrockstar - com certeza o Redis 3 ainda é único núcleo; pelo menos AWS Redis (que usa 3.2.6 ou 3.2.10) adverte que levar isso em conta quando se olha para eg EngineCpuUtilization Metrics
dwanderson
1
Parece que você está certo, acho que quando fiz esse comentário, baseei-o em fontes incompletas. Comentário excluído.
siliconrockstar
mas você ainda pode lançar $ instâncias core_count de Redis
Imaskar
2
O Redis está extremamente focado na eficiência - então você precisa se perguntar por que um monte de desenvolvedores inteligentes optou por mantê-lo único. Nos documentos do redis "Não é muito frequente que a CPU se torne seu gargalo com o Redis, pois geralmente o Redis está ligado à memória ou à rede". Se você usasse um servidor pesado vinculado à CPU, provavelmente teria muitos usuários e, de qualquer maneira, deveria ter vários servidores redundantes. Se você deseja maximizar várias CPUs em um único servidor, use o particionamento. Leia: redis.io/topics/…
robocat 5/1118
91

Isso é muito longo para ser postado como um comentário na resposta já aceita, então eu o coloquei como uma resposta separada

Uma coisa a considerar também é se você espera ter um limite de memória superior na sua instância de cache.

Como o redis é um banco de dados nosql com muitos recursos e o cache é apenas uma opção para a qual ele pode ser usado, ele aloca memória conforme necessário - quanto mais objetos você colocar nele, mais memória ele usará. A maxmemoryopção não impõe estritamente o uso do limite de memória superior. Conforme você trabalha com o cache, as chaves são despejadas e expiradas; é provável que suas chaves não tenham o mesmo tamanho, portanto ocorre a fragmentação da memória interna.

Por padrão, o redis usa o alocador de memória jemalloc , que faz o possível para ser compacto e rápido, mas é um alocador de memória de uso geral e não pode acompanhar muitas alocações e purgas de objetos ocorrendo a uma taxa alta. Por esse motivo, em alguns padrões de carga, o processo redis aparentemente pode vazar memória devido à fragmentação interna. Por exemplo, se você possui um servidor com 7 Gb de RAM e deseja usar redis como cache LRU não persistente, poderá descobrir que o processo de redis com 5 Gb maxmemoryao longo do tempo usaria mais e mais memória, atingindo eventualmente o limite total de RAM até O assassino sem memória interfere.

O memcached é mais adequado ao cenário descrito acima, pois gerencia sua memória de uma maneira completamente diferente. O memcached aloca um grande pedaço de memória - tudo o que será necessário - e depois gerencia essa memória por si só, usando seu próprio alocador de laje implementado . Além disso, o memcached tenta manter a fragmentação interna baixa, pois na verdade usa o algoritmo LRU por laje , quando as remoções de LRU são feitas com o tamanho do objeto considerado.

Com isso dito, o memcached ainda tem uma posição forte em ambientes, onde o uso da memória deve ser imposto e / ou previsível. Tentamos usar os redis estáveis ​​mais recentes (2.8.19) como uma substituição de cache de memórias não persistente baseada em LRU, em uma carga de trabalho de 10 a 15k op / s, e vazou muito a memória; a mesma carga de trabalho estava travando as instâncias do ElastiCache da Amazon em um dia ou mais por causa dos mesmos motivos.

artyom
fonte
2
No redis.io/topics/faq : o Redis possui proteções internas que permitem ao usuário definir um limite máximo para o uso da memória, usando a opção maxmemory no arquivo de configuração para colocar um limite na memória que o Redis pode usar. Se esse limite for atingido, o Redis começará a responder com um erro para gravar comandos (mas continuará a aceitar comandos somente leitura) ou você poderá configurá-lo para remover chaves quando o limite máximo de memória for atingido no caso de você usar o Redis para armazenamento em cache. Temos documentação se você planeja usar o Redis como um cache LRU. link
StefanNch 4/15
8
A maxmemoryopção @StefanNch redis ' não considera a fragmentação da memória interna. Consulte o meu comentário acima para obter detalhes - os problemas que descrevi foram vistos no cenário descrito na página "Redis como um cache LRU" com as opções de limitação de memória ativadas. O memcached, por outro lado, usa uma abordagem diferente para evitar problemas de fragmentação da memória; portanto, seu limite de memória é muito mais "rígido".
Artyom
46

Memcached é bom em ser um simples armazenamento de chave / valor e é bom em fazer key => STRING. Isso o torna realmente bom para o armazenamento da sessão.

Redis é bom em fazer a chave => SOME_OBJECT.

Realmente depende do que você vai colocar lá. Meu entendimento é que, em termos de desempenho, eles são bem uniformes.

Também boa sorte em encontrar pontos de referência objetivos, se você encontrar algum gentilmente envie-os em meu caminho.

Erik Petersen
fonte
2
O IMO, o tipo de dados Redis Hash, faz muito mais sentido para armazenar variáveis ​​de sessão do que serializá-las em uma sequência armazenada em cache.
Carl Zulauf
6
Se você se preocupa com a experiência do usuário, não coloque suas sessões em cache. dormando.livejournal.com/495593.html
sleblanc
4
@sebleblanc Isso teoricamente não deve ser um problema para o Redis, já que também há persistência no disco.
haknick
2
O memcache @sebleblanc ainda é bom no armazenamento da sessão, você o implementa mal ou não. sim, despejo é um problema, mas não é intransponível, também não é problema do memcache se você não se preocupar com despejo. A maioria das soluções de sessão do memcache usa cookies como backup, acredito.
Erik Petersen
11
"Não coloque suas sessões em cache" é enganoso. O que você quer dizer é "Não armazene apenas suas sessões no cache". Qualquer pessoa que armazena dados importantes apenas no memcache deve ser acionada imediatamente.
Jacob
37

Se você não se importa com um estilo de escrita grosseiro, Redis vs Memcached no blog Systoilet vale a pena ser lido do ponto de vista da usabilidade, mas não deixe de ler os comentários nos comentários antes de tirar conclusões sobre o desempenho; existem alguns problemas metodológicos (testes de ciclo ocupado de thread único) e o Redis fez algumas melhorias desde que o artigo foi escrito também.

E nenhum link de benchmark está completo sem confundir um pouco as coisas, portanto, verifique também alguns benchmarks conflitantes no LiveJournal de Dormondo e no Antirez Weblog .

Editar - como salienta Antirez, a análise de Systoilet é bastante mal concebida. Mesmo além do déficit de thread único, grande parte da disparidade de desempenho nesses benchmarks pode ser atribuída às bibliotecas do cliente, em vez da taxa de transferência do servidor. Os benchmarks no Antirez Weblog apresentam, de fato, uma comparação muito maior entre as maçãs (com a mesma boca).

Paul Smith
fonte
9
o benchmark Redis vs Memcached é mal concebido. oldblog.antirez.com/post/redis-memcached-benchmark.html
Trabalho de aplicativo
28
Você não estava brincando de grosseiro.
Ocho
1
Mais sobre seu blog desatualizado de 2010 #
Siddharth
24

Eu tive a oportunidade de usar o memcached e o redis juntos no proxy de cache em que trabalhei, deixe-me compartilhar onde exatamente usei o que e o motivo por trás do mesmo ....

Redis>

1) Usado para indexar o conteúdo do cache, no cluster. Eu tenho mais de um bilhão de chaves espalhadas por clusters de redis, o tempo de resposta dos redis é bem menor e estável.

2) Basicamente, é um armazenamento de chave / valor, portanto, onde quer que você tenha algo semelhante em seu aplicativo, pode-se usar o redis com muito esforço.

3) Redis persistência, failover e backup (AOF) facilitarão seu trabalho.

Memcache>

1) sim, uma memória otimizada que pode ser usada como cache. Usei-o para armazenar o conteúdo do cache sendo acessado com muita frequência (com 50 ocorrências / segundo) com tamanho menor que 1 MB.

2) Aloquei apenas 2 GB de 16 GB para o memcached também quando meu tamanho de conteúdo único era> 1 MB.

3) À medida que o conteúdo cresce próximo aos limites, ocasionalmente observei tempos de resposta mais altos nas estatísticas (não no caso de redis).

Se você pedir uma experiência geral, o Redis é muito verde, pois é fácil de configurar, muito flexível com recursos robustos estáveis.

Além disso, há um resultado de benchmarking disponível neste link . Abaixo estão alguns destaques,

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Espero que isto ajude!!

Jain Rach
fonte
14

Teste. Execute alguns benchmarks simples. Por um longo tempo, eu me considerava um rinoceronte da velha escola, pois usava principalmente o memcached e considerava o Redis o novo garoto.

Com minha empresa atual, o Redis foi usado como o cache principal. Quando analisei algumas estatísticas de desempenho e simplesmente comecei a testar, o Redis era, em termos de desempenho, comparável ou minimamente mais lento que o MySQL.

Memcached, embora simplista, expulsou totalmente os Redis da água . Escalou muito melhor:

  • para valores maiores (alteração necessária no tamanho da laje, mas funcionou)
  • para várias solicitações simultâneas

Além disso, na minha opinião, a política de despejo de memcached é muito melhor implementada, resultando em um tempo médio de resposta geral mais estável ao lidar com mais dados do que o cache pode suportar.

Alguns testes de desempenho revelaram que o Redis, no nosso caso, tem um desempenho muito ruim. Isso, acredito, tem a ver com muitas variáveis:

  • tipo de hardware em que você executa o Redis
  • tipos de dados que você armazena
  • quantidade de recebe e define
  • quão concorrente é seu aplicativo
  • você precisa de armazenamento de estrutura de dados

Pessoalmente, não compartilho a visão que os autores do Redis têm sobre simultaneidade e multithreading.

mdomans
fonte
por favor, explique "minimamente mais lento que o MySQL".
Anirudha Gupta 18/0318
Truty ser dito eu não tenho esses dados de referência na mão, mas que determinado caso foi um monte de leitura / gravação ops
mdomans
13

Outro bônus é que pode ficar muito claro como o memcache se comportará em um cenário de armazenamento em cache, enquanto o redis geralmente é usado como um armazenamento de dados persistente, embora possa ser configurado para se comportar exatamente como o memcached, também conhecido como despejo de itens menos usados ​​recentemente, quando atingir o máximo capacidade.

Alguns aplicativos em que trabalhei usam os dois apenas para deixar claro como pretendemos que os dados se comportem - coisas no memcache, escrevemos código para lidar com os casos em que não estão lá - coisas em redis, contamos com a presença deles .

Fora isso, o Redis geralmente é considerado superior, pois a maioria dos casos de uso é mais rica em recursos e, portanto, flexível.

Scott Schulthess
fonte
10

Não seria errado se dissermos que redis é uma combinação de (cache + estrutura de dados) enquanto o memcached é apenas um cache.

Atif Hussain
fonte
1
esta é uma boa resposta - Laravel está usando Redis como cache e como mecanismo de armazenamento de dados
Miroslav Trninic
8

Um teste muito simples para definir e obter 100k chaves e valores exclusivos contra o redis-2.2.2 e o memcached. Ambos estão sendo executados em linux VM (CentOS) e o código do meu cliente (colado abaixo) é executado na área de trabalho do Windows.

Redis

  • O tempo necessário para armazenar 100000 valores é = 18954ms

  • O tempo necessário para carregar 100000 valores é = 18328ms

Memcached

  • O tempo necessário para armazenar 100000 valores é = 797ms

  • O tempo necessário para recuperar 100000 valores é = 38984ms


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");
Prabhu Nandan Kumar
fonte
6
Como você obviamente usou o Java para medição ... "aqueceu" seus casos de teste? Isso é essencial para medir um tempo tão curto ... que o JIT compilou os pontos quentes.
Cljk
7

Uma grande diferença que não foi apontada aqui é que o Memcache sempre possui um limite superior de memória, enquanto o Redis não possui por padrão (mas pode ser configurado para). Se você sempre deseja armazenar uma chave / valor por um determinado período de tempo (e nunca despejá-la devido à pouca memória), deseja usar o Redis. Claro, você também corre o risco de ficar sem memória ...

Ztyx
fonte
6

O maior motivo restante é a especialização.

Os Redis podem fazer muitas coisas diferentes, e um efeito colateral disso é que os desenvolvedores podem começar a usar muitos desses conjuntos de recursos diferentes na mesma instância. Se você estiver usando o recurso LRU do Redis para um cache ao lado do armazenamento de dados físicos que NÃO é LRU, é totalmente possível ficar sem memória.

Se você estiver configurando uma instância Redis dedicada para ser usada SOMENTE como uma instância LRU para evitar esse cenário específico, não há realmente nenhum motivo atraente para usar Redis sobre Memcached.

Se você precisar de um cache LRU confiável "nunca desce" ... O Memcached se ajustará à conta, pois é impossível ficar sem memória por design e a funcionalidade especializada impede que os desenvolvedores tentem torná-lo algo que possa ameaçar isso. Separação simples de preocupações.

bola brilhante
fonte
6

O Memcached será mais rápido se você estiver interessado em desempenho, mesmo porque o Redis envolve redes (chamadas TCP). Também internamente o Memcache é mais rápido.

O Redis possui mais recursos, como foi mencionado por outras respostas.

Denys
fonte
6

Pensamos em Redis como uma decolagem de carga para o nosso projeto no trabalho. Pensamos que, usando um módulo nginxchamado HttpRedis2Moduleou algo semelhante, teríamos uma velocidade incrível, mas ao testar com o teste AB, estamos errados.

Talvez o módulo estivesse ruim ou nosso layout, mas era uma tarefa muito simples e era ainda mais rápido coletar dados com php e depois inseri-los no MongoDB. Estamos usando a APC como sistema de cache e com esse php e MongoDB. Foi muito mais rápido que o nginxmódulo Redis.

Minha dica é testá-lo você mesmo, mostrando os resultados para o seu ambiente. Decidimos que o uso de Redis era desnecessário em nosso projeto, pois não faria sentido.

Ms01
fonte
Resposta interessante, mas não tenho certeza se isso ajuda a OP
Scott Schulthess
Inserir no Redis e usá-lo como cache foi mais lento do que usar APC + PHP + MongoDB. Mas apenas a inserção no Redis foi MUITO mais lenta que a inserção direta no MongoDB. Sem a APC, acho que são iguais.
Ms01
2
Isso porque mongo não lhe dá qualquer garantia de que o que você inseriu é sempre vai ser escrito para o disco ...
Damian
21
mas é em escala da web, o mongodb corre em torno de você em círculos enquanto você escreve. Hoje em dia eu só escrevo para / dev / null porque é o mais rápido.
Ms01
1

Redis é melhor.

Os profissionais de Redissão,

  1. Possui várias opções de armazenamento de dados, como string, conjuntos, conjuntos classificados, hashes e bitmaps
  2. Persistência de disco dos registros
  3. LUASuporte para Procedimento Armazenado ( script)
  4. Pode atuar como um Message Broker usando PUB / SUB

Considerando que Memcacheé um sistema de tipo de cache de valor da chave na memória.

  1. Não há suporte para vários tipos de armazenamento de dados, como listas, conjuntos, como em redis.
  2. O principal golpe é o Memcache não tem persistência de disco.
athavan kanapuli
fonte
0

Bem, eu usei principalmente os meus aplicativos, o Memcache para armazenar em cache as sessões e o redis para objetos de doutrina / orm query. Em termos de desempenho, ambos são quase iguais.

Muhammad Taqi
fonte
0

Aqui está o realmente ótimo artigo / diferenças fornecidas pela Amazon

Redis é um vencedor claro em comparação com o memcached.

Apenas um ponto positivo para o Memcached É multithread e rápido. O Redis possui muitos recursos excelentes e é muito rápido, mas limitado a um núcleo.

Ótimos pontos sobre Redis, que não são suportados no Memcached

  • Instantâneos - O usuário pode tirar um instantâneo do cache Redis e persistir no armazenamento secundário a qualquer momento.
  • Suporte embutido para muitas estruturas de dados como Set, Map, SortedSet, List, BitMaps etc.
  • Suporte para scripts Lua em redis
nagendra547
fonte