Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Memcached vs. Redis?

Resumo (TL;DR)


Atualizado em 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 das coisas que o Redis pode fazer. O Redis é melhor mesmo quando seus recursos se sobrepõem.

Para algo novo, use o Redis.

Memcached x Redis:comparação direta


Ambas as ferramentas são armazenamentos de dados na memória poderosos e rápidos que são úteis como cache. Ambos podem ajudar a acelerar seu aplicativo armazenando em cache os resultados do banco de dados, fragmentos HTML ou qualquer outra coisa que possa ser cara para gerar.

Pontos a considerar


Quando usado para a mesma coisa, aqui está 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, versões e muitos outros fatores, mas geralmente mostram que o redis é tão rápido ou quase tão rápido quanto o memcached. Eu recomendo o redis, mas não porque o memcached é lento. Não é.
  • Uso de memória :Redis é melhor.
    • memcached:Você especifica o tamanho do cache e conforme você insere itens, o daemon cresce rapidamente para um pouco mais do que esse tamanho. Nunca há realmente uma maneira de recuperar esse espaço, exceto reiniciar o memcached. Todas as suas chaves podem ter expirado, você pode liberar o banco de dados e ele ainda usará todo o pedaço de RAM com o qual você o configurou.
    • redis:a definição de um tamanho máximo fica a seu critério. O Redis nunca usará mais do que o necessário e devolverá a memória que não está mais usando.
    • Eu armazenei 100.000 strings de ~2KB (~200MB) de frases aleatórias em ambos. O uso de RAM do Memcached cresceu para ~225 MB. O uso de RAM do Redis cresceu para ~ 228 MB. Depois de liberar os dois, o redis caiu para ~ 29 MB e o memcached ficou em ~ 225 MB. Eles são igualmente eficientes na forma como armazenam dados, mas apenas um é capaz de recuperá-los.
  • Dumping de E/S de disco :Uma vitória clara para o redis, pois faz isso por padrão e tem persistência muito configurável. O Memcached não tem mecanismos para despejar em disco sem ferramentas de terceiros.
  • Escalonamento :ambos oferecem muito espaço antes que você precise de mais de uma única instância como cache. O Redis inclui ferramentas para ajudá-lo a ir além disso, enquanto o memcached não.

memcached


O Memcached é um servidor de cache volátil simples. Ele permite que você armazene pares de chave/valor onde o valor é 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, geralmente saturando a rede disponível ou até a largura de banda da memória.

Quando você reinicia o memcached, seus dados desaparecem. Isso é bom para um cache. Você não deve armazenar nada importante lá.

Se você precisar de alto desempenho ou alta disponibilidade, existem ferramentas, produtos e serviços de terceiros disponíveis.

redis


O Redis pode fazer os mesmos trabalhos que o memcached e pode fazê-los melhor.

O Redis também pode atuar como um cache. Ele também pode armazenar pares de chave/valor. No redis, eles podem ter até 512 MB.

Você pode desativar a persistência e também perderá seus dados na reinicialização. Se você deseja que seu cache sobreviva às reinicializações, ele também permite que você faça isso. Na verdade, 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 a cluster e vem com ferramentas de alta disponibilidade (redis-sentinel) "na caixa". Ao longo dos últimos anos, o redis também emergiu como o líder claro em ferramentas de terceiros. Empresas como Redis Labs, Amazon e outras oferecem muitas ferramentas e serviços úteis de redis. O ecossistema em torno do redis é muito maior. O número de implantações em grande escala agora é provavelmente maior do que para o memcached.

O superconjunto Redis


Redis é mais do que um cache. É um servidor de estrutura de dados na memória. Abaixo, você encontrará uma rápida visão geral das coisas que o Redis pode fazer além de ser um simples cache de chave/valor como o memcached. A maioria dos recursos do redis são coisas que o memcached não pode fazer.

Documentação


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 de fácil navegação. Ele permite que você experimente o redis no navegador e até fornece exemplos interativos ao vivo com cada comando nos documentos.

Agora há 2x mais resultados de stackoverflow para redis do que memcached. 2x mais resultados do Google. Exemplos mais facilmente acessíveis em mais idiomas. Desenvolvimento mais ativo. Desenvolvimento mais ativo do cliente. Essas medições podem não significar muito individualmente, mas em combinação elas mostram 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 mantém seus dados em disco usando um mecanismo chamado snapshot. Se você tiver RAM suficiente disponível, ele poderá gravar todos os seus dados no disco com quase nenhuma degradação de 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 precisa garantir que nenhum dado seja perdido, não se preocupe, o redis também está 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 a taxa de transferência máxima de gravação para o quão rápido seu disco pode gravar, mas ainda 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 sensatos. Essas opções facilitam a configuração do redis como um local seguro e redundante para armazenar dados. É um real base de dados.

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. Este é o único compartilhamento de tipo de dados redis e memcached, embora as strings do memcached sejam limitadas a 1 MB.

O Redis oferece mais ferramentas para aproveitar esse tipo de dados, oferecendo comandos para operações bit a bit, manipulação em nível de bit, suporte a incremento/decremento de ponto flutuante, consultas de intervalo e operações com várias teclas. O 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 valor-chave dentro de um armazenamento de valor-chave. Eles mapeiam entre campos de string e valores de string. Mapas de valor> campo usando um hash são um pouco mais eficientes em termos de espaço do que mapas de valor> chave usando strings regulares.

Hashes são úteis como um namespace 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 redis hash armazenado com o ID do usuário como a chave permitirá que você armazene 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 string é que você pode ter aplicativos diferentes para ler/gravar campos diferentes dentro do perfil do usuário sem ter que se preocupar com um aplicativo substituindo as alterações feitas por outros (o que pode acontecer se você serializar o antigo 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 push/pop de itens, push/pop entre listas, truncar listas, realizar consultas de intervalo, etc.

Listas são ótimas filas duráveis ​​e atômicas. 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 únicos. Eles são otimizados para permitir que você verifique rapidamente se um valor está no conjunto, adicione/remova valores rapidamente e meça a sobreposição com outros conjuntos.

Eles são ótimos 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 Set). É assim, só distribuído.

O Redis fornece vários comandos para gerenciar conjuntos. Os óbvios como adicionar, remover e verificar o conjunto estão presentes. Assim como comandos menos óbvios, como abrir/ler um item aleatório e comandos para realizar uniões e interseções com outros conjuntos.

Conjuntos ordenados (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 partitura e, em seguida, lexicograficamente.

Esse tipo de dados é otimizado para pesquisas rápidas por pontuação. Obter os valores mais altos, mais baixos ou qualquer intervalo de valores intermediários é extremamente rápido.

Se você adicionar usuários a um conjunto classificado junto com sua pontuação mais alta, você terá um quadro de líderes perfeito. À medida que novos recordes chegam, basta adicioná-los ao conjunto novamente com sua pontuação mais alta e ele reordenará seu quadro de líderes. Também é ótimo para acompanhar a última vez que os usuários visitaram e quem está ativo em seu aplicativo.

Armazenar valores com a mesma pontuação faz com que eles sejam ordenados lexicograficamente (pense em ordem alfabética). Isso pode ser útil para coisas como recursos de preenchimento automático.

Muitos dos comandos de conjuntos ordenados são semelhantes aos comandos para conjuntos, às vezes com um parâmetro de pontuação adicional. Também estão incluídos comandos para gerenciar pontuações e consultar por pontuação.

Geográfico


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.

Os dados tecnicamente geográficos no 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 ordenados.

Bitmap e HyperLogLog


Assim como geo, esses não são tipos de dados completamente separados. Esses são comandos que permitem tratar dados de string como se fossem um bitmap ou um hyperloglog.

Bitmaps são o que os operadores de nível de bits referenciados em Strings são para. Este tipo de dados foi o bloco de construção básico para o recente projeto de arte colaborativa do reddit:r/Place.

HyperLogLog permite que você use uma quantidade de espaço extremamente pequena constante 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 você pode ter certeza de que, assim que escrever um valor para redis, esse valor ficará visível para todos os clientes conectados ao redis. Não há espera para que esse valor se propague. Tecnicamente, o memcached também é atômico, mas com o redis adicionando toda essa funcionalidade além do memcached, vale a pena notar e um tanto impressionante que todos esses tipos de dados e recursos adicionais também são 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).

Encanamento


O Redis fornece um recurso chamado 'pipelining'. Se você tiver muitos comandos redis que deseja executar, poderá usar o pipelining para enviá-los para redis de uma só 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, o redis pode 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 que você obtenha uma taxa de transferência ainda maior na importação em massa ou outras ações que envolvam 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 assim como quase qualquer ferramenta. Agentes de mensagens dedicados como o RabbitMQ podem ter vantagens em certas áreas, mas o fato de que o mesmo servidor também pode fornecer filas duráveis ​​persistentes e outras estruturas de dados que suas cargas de trabalho de pub/sub provavelmente precisam, o Redis muitas vezes provará ser a melhor e mais simples ferramenta para o trabalho.

Lua Scripts


Você pode pensar em scripts lua como o próprio SQL do redis ou procedimentos armazenados. É mais e menos do que isso, mas a analogia funciona principalmente.

Talvez você tenha cálculos complexos que deseja que o redis execute. Talvez você não possa se dar ao luxo de reverter suas transações e precisa de garantias de que cada etapa de um processo complexo acontecerá atomicamente. Esses problemas e muitos outros podem ser resolvidos com scripts de lua.

O script inteiro é executado atomicamente, portanto, se você puder encaixar sua lógica em um script lua, poderá evitar mexer com transações de bloqueio otimistas.

Escalonamento


Como mencionado acima, o redis inclui suporte integrado para clustering e é empacotado com sua própria ferramenta de alta disponibilidade chamada redis-sentinel .

Conclusão


Sem hesitação, eu recomendaria redis em vez de memcached para novos projetos ou projetos existentes que ainda não usam o memcached.

O acima pode soar como se eu não gostasse do memcached. Pelo contrário:é uma ferramenta poderosa, simples, estável, madura e endurecida. Existem até alguns casos de uso em que é um pouco mais rápido que o redis. Eu amo o memcached. Eu só não acho que faz muito sentido para o desenvolvimento futuro.

O Redis faz tudo o que o memcached faz, geralmente melhor. Qualquer vantagem de desempenho para o memcached é menor e específica da carga de trabalho. Há também cargas de trabalho para as quais o redis será mais rápido e muito mais cargas de trabalho que o redis pode fazer e o memcached simplesmente não pode. As pequenas diferenças de desempenho parecem pequenas em face do abismo gigante na funcionalidade e do fato de que ambas as ferramentas são tão rápidas e eficientes que podem muito bem ser a última peça de sua infraestrutura que você terá que se preocupar com dimensionamento.

Há apenas um cenário em que o memcached faz mais sentido:onde o memcached já está em uso como cache. Se você já estiver armazenando em cache com o memcached, continue usando-o, se atender às suas necessidades. Provavelmente não vale a pena mudar para o redis e, se você for usar o redis apenas para armazenar em cache, ele pode não oferecer benefícios suficientes para valer o seu tempo. Se o memcached não atender às suas necessidades, você provavelmente deve mudar para o redis. Isso é verdade se você precisar escalar além do memcached ou precisar de funcionalidades adicionais.