Memcached é um dinossauro em comparação com Redis? [fechadas]

185

Eu trabalhei bastante com o memcached nas últimas semanas e acabei de descobrir sobre o Redis. Quando li essa parte do leia-me, de repente tive uma sensação quente e aconchegante no estômago:

Redis pode ser usado como um memcached em esteróides porque é tão rápido quanto o memcached, mas com vários recursos a mais. Como o memcached, o Redis também suporta a configuração de tempos limites para chaves, para que essa chave seja removida automaticamente quando um determinado período de tempo passar.

Isso parece incrível. Eu também encontrei esta página com referências: http://www.ruturaj.net/redis-memcached-tokyo-tyrant-mysql-comparison

Então, honestamente - o memcache é realmente aquele velho dinousaur que é uma má escolha do ponto de vista de desempenho quando comparado a esse novato chamado Redis?

Não ouvi muito sobre Redis anteriormente, portanto, a abordagem para minha pergunta!

Industrial
fonte
Leitura adicional interessante: nosql.mypopescu.com/post/519078332/memcached-on-top-of-redis
Industrial
9
este benchmark ruturaj não é realmente vale a pena muita atenção
dsomnus
2
Começamos a experimentar w / Membase no trabalho e felizes até agora. Embora, nós estamos vindo de Memcache, assim que ter uma queda na substituição foi a mais agradável: membase.org
jayshao
2
O Redis é tão rápido quanto o memcached para benchmarks não-reais. Isso não é sugerir que é lento - certamente é rápido o suficiente para a maioria das cargas de trabalho, mas coisas mais rápidas que o memcached apenas revelam bugs no memcached. É quase sempre prejudicado pelo hardware ou pelo mau design do aplicativo.
Dustin
4
Estou surpreso que a santidade da patrulha SO não tenha encerrado esta questão como inadequada e inútil.
Dogweather

Respostas:

74

Memcache é uma excelente ferramenta ainda e MUITO confiável.

em vez de analisar esse problema da perspectiva de diminuir quem é mais rápido na faixa de <100 ms, observe o desempenho por "classe" do software.

  • Ele usa apenas ram local? -> mais rápido
  • Ele usa memória ram remota? -> rápido
  • Ele usa ram mais disco rígido -> oh hurm.
  • Ele usa apenas disco rígido -> execute!
Daniel
fonte
3
Não há nenhum recurso para lidar com a replicação com o memcache que eu conheço. Memcache é puramente destinado a ser um cache. Se o item for eliminado / perdido, ele precisará ser reconstruído. Eu nunca usei isso antes nem o avaliei, mas isso pode ser do seu interesse. code.google.com/p/memagent
Daniel
1
Membase suporta o protocolo memcached, mas também persistência e replicação.
Jim Ferrans
1
Recentemente, vi ethernet ligado em quatro portas. 4 x 44MB / s. Isso torna o ram ainda mais valioso, supondo que você possa obter a ligação via Ethernet!
Daniel
1
Para fins de referência futura, o grupo de código aberto do Facebook recentemente, que adiciona replicação ao memcached. Outras coisas também são datados (Redis é super rápido agora, etc), mas FYI se você está aqui cinco anos mais tarde ...
dannysauer
bem, qual é o ponto? ambos não podem armazenar um simples array de json direclty, o formato de intercâmbio de DADOS mais amplamente usado na web, não tenho idéia do que eles estavam pensando ... oh espere, talvez eu deva adicionar ReJSON porque, originalmente, ninguém se importa com JSON no mundo certo
PirateApp
205

Depende do que você precisa, em geral, acho que:

  • Você não deve se importar muito com performances. O redis é mais rápido por núcleo com valores pequenos, mas o memcached pode usar vários núcleos com uma única porta executável e TCP sem a ajuda do cliente. O memcached também é mais rápido, com grandes valores na ordem de 100k. O Redis recentemente melhorou bastante em relação a grandes valores (ramificação instável), mas ainda assim o memcached é mais rápido nesse caso de uso. O ponto aqui é: nem um ou outro provavelmente será o seu gargalo para a consulta por segundo que eles podem fornecer.
  • Você deve se preocupar com o uso de memória. Para pares simples de valores-chave, o memcached é mais eficiente em termos de memória. Se você usa hashes Redis, o Redis é mais eficiente em memória. Depende do caso de uso.
  • Você deve se preocupar com persistência e replicação, dois recursos disponíveis apenas no Redis. Mesmo que seu objetivo seja criar um cache, é útil que, após uma atualização ou reinicialização, seus dados ainda estejam lá.
  • Você deve se preocupar com o tipo de operações que precisa. No Redis, existem muitas operações complexas, mesmo considerando o caso de uso de armazenamento em cache, muitas vezes você pode fazer muito mais em uma única operação, sem exigir que os dados sejam processados ​​no lado do cliente (muitas vezes é necessária muita E / S). Essas operações geralmente são tão rápidas quanto GET e SET. Portanto, se você não precisa apenas de GET / SET, mas de coisas mais complexas, o Redis pode ajudar muito (pense no cache da linha do tempo).

Sem um caso de uso, é difícil escolher o momento, mas acho que, para muitas coisas, o Redis faz sentido, pois mesmo quando você não deseja usá-lo como um banco de dados, sendo muito mais capaz, você pode resolver mais problemas, não apenas cache, mas também mensagens, classificação e assim por diante.

Ps, claro, eu poderia ser tendencioso, já que sou o principal desenvolvedor do projeto Redis.

antirez
fonte
67
+1 para grande divulgação no final
NateDSaint
6
Não tenho certeza se isso é um erro de linguagem, mas se você liderar sua discussão com "em geral, acho que você não deve se importar muito com o desempenho", isso é motivo de preocupação. Redis pode ser muito bom para certas classes de problemas, mas, tradicionalmente, o memcache foi usado especificamente para resolver problemas de desempenho com bancos de dados persistentes. Também acho que uma omissão flagrante da sua lista é a maturidade do produto. Memcache é um produto maduro, com cerca de uma década de experiência. Redis é promissor, mas só existe há 3 anos.
DougW 21/09/12
1
@ DougW Você está pegando esta frase fora de contexto. Faz muito mais sentido quando você lê a frase que fecha o parágrafo logo após: "O ponto aqui é: nem um nem outro provavelmente será o seu gargalo para a consulta por segundo que eles podem fornecer"
Dinei
83

Então, honestamente - o memcache é realmente aquele velho dinousaur que é uma má escolha do ponto de vista de desempenho quando comparado a esse novato chamado Redis?

  • Comparando os recursos definidos então Redis tem muito mais funcionalidade;
  • Comparando a facilidade de instalação Redis também é muito mais fácil. Não são necessárias dependências;
  • Comparando Desenvolvimento Ativo Redis também é melhor;
  • Acredito memcached é um pouco mais rápido queRedis . Não toca no disco;
  • Minha opinião é que Redisé melhor produto do que memcached.
Alfred
fonte
31
o redis toca apenas no disco se você o solicitar. Normalmente, ele faz uma fsync cada segundo ou assim -> você não vai notar que
Marc Seeger
1
@Marc yup. Eu também acredito que você pode dizer para não tocar no disco, mas padrão eu acredito que sempre fsyncs agora?
Alfred
3
Além disso, na minha experiência, o Redis é um pouco mais rápido que o Memcached (ao usar o Redis no modo somente memória). Antirez fez um teste aqui antirez.com/post/redis-memcached-benchmark.html
Sune Rievers
10
GRANDE DIFERENÇA: Memcached é multiencadeado e Redis não. Portanto, embora a latência de uma única solicitação seja comparável, o Memcached pode atender a muitas outras solicitações quando a simultaneidade for alta. Os Redis, por outro lado, atingirão seu pico de desempenho com apenas algumas solicitações simultâneas, uma vez que usam apenas 1 núcleo / thread de CPU. O método sugerido para contornar isso é executar várias instâncias do Redis em uma máquina com hash consistente, mas essa é uma solução realmente ruim. Portanto, se você precisar de alta simultaneidade e possuir CPU com vários núcleos (quem não precisa), o Memcached é MUITO mais rápido.
ColinM em
2
@ Alfred, não é um fato oculto que o Redis seja de thread único, é uma decisão de design (simplicidade sobre robustez) do autor. O artigo que Dustin vinculou acima é uma evidência sólida de que tem um impacto real. Também confirmei isso em meus próprios benchmarks usando o Redis como um backend do Zend_Cache; À medida que a concorrência aumenta, o Redis se estabiliza rapidamente em comparação ao memcached.
ColinM 16/04
46

O que o memcached faz que o Redis não faz é o despejo de valores menos usado recentemente do cache. Com o memcached, você pode definir com segurança quantos valores desejar e, quando eles excederem a memória, os que você não usou recentemente serão excluídos. Com o Redis, você só pode aproximar isso definindo um tempo limite para tudo; quando precisar liberar memória, examinará três chaves aleatórias e excluirá a que estiver mais próxima de expirar.

Essa é a principal diferença, se você estiver usando apenas como cache.

Peter Scott
fonte
13

Você também pode querer olhar para Membase.

http://www.northscale.com/products/membase_server.html

Eu não o usei, mas parece ser semelhante ao Redis, pois é um armazenamento KV centrado na memória com persistência. As principais diferenças do que eu posso ver são:

  • O Redis possui significativamente mais capacidade de manipulação de dados (conjuntos solicitados etc.)
  • Redis tem um projeto Redis Cluster pendente para adicionar escalabilidade horizontal
  • O Redis possui uma única camada de transferência de dados para o disco (VM) com base em um algoritmo híbrido que considera a LRU e o tamanho do objeto.

  • Membase usa o protocolo de conexão em cache memcached - útil como um caminho de atualização para aplicativos existentes

  • O Membase é configurado para dimensionar horizontalmente usando uma abordagem hashtable distribuída
  • O Membase pode suportar várias camadas de transferência de dados usando uma abordagem LRU (muito raramente é usado no disco, um pouco raramente o material é enviado para o SSD, o material frequente permanece na RAM)
  • Não tenho certeza sobre a capacidade TTL em Membase.

A escolha pode depender do grau em que seu aplicativo pode aproveitar a funcionalidade extra de manipulação de dados no Redis.

HikeOnPast
fonte
Olá Dean, obrigado pela sua publicação. Eu vou definitivamente conferir. Posso usar o Membase em PHP?
Industrial
4
Como o Membase usa o protocolo memcached, qualquer um dos clientes memcached deve funcionar: wiki.membase.org/bin/view/Main/Clients
HikeOnPast
Membase suporta TTL. Todo o suporte às implementações do Memcache coloca um prazo de validade. github.com/memcached/memcached/blob/master/doc/protocol.txt#L79
Saurav