Quando devo usar o Memcache em vez do Memcached?


321

Parece que o PHP tem duas bibliotecas memcached denominadas memcache e memcached . Qual é a diferença e como você sabe qual usar? Um está desatualizado? Parece que o memcached oferece mais métodos, portanto, eu suponho que isso teve mais desenvolvimento - mas também parece exigir bibliotecas externas de C / C ++, então não tenho certeza se posso instalá-lo.

Parece que o memcache existe há mais tempo, não requer bibliotecas adicionais e possui binários pré-compilados para janelas iguais! Eu pensaria que seria a melhor escolha por enquanto. No entanto, sendo novo no memcached (servidor), não tenho certeza se existem alguns recursos super importantes no memcached (php) que valem a pena o trabalho extra.


1
O ZendCon tem um bom episódio comparando os dois. ZendCon Sessões Episode 040: Memcached: o melhor interface de Memcache
John Magnolia

duplicar de serverfault.com/questions/63383/memcache-vs-memcached por apenas alguns dias, mas esta teve mais visualizações e votos :)
Stefano

Respostas:


249

A biblioteca do cliente Memcached foi lançada recentemente como estável. Ele está sendo usado pelo digg (desenvolvido para o digg por Andrei Zmievski, agora não mais com o digg) e implementa muito mais do protocolo memcached do que o cliente memcache mais antigo. Os recursos mais importantes que o memcached possui são:

  1. Tokens de Cas . Isso tornou minha vida muito mais fácil e é um sistema preventivo fácil para dados obsoletos. Sempre que você extrai algo do cache, pode receber com ele um token cas (um número duplo). Você pode usar esse token para salvar seu objeto atualizado. Se ninguém mais atualizou o valor enquanto seu encadeamento estava em execução, a troca será bem-sucedida. Caso contrário, um token de cas mais recente foi criado e você é obrigado a recarregar os dados e salvá-los novamente com o novo token.
  2. Retornos de chamada lidos são a melhor coisa desde pão fatiado. Simplificou muito do meu código.
  3. getDelayed () é um recurso interessante que pode reduzir o tempo que o script precisa aguardar para que os resultados retornem do servidor.
  4. Embora o servidor memcached deva ser muito estável, ele não é o mais rápido. Você pode usar o protocolo binário em vez do ASCII com o cliente mais recente.
  5. Sempre que você salva dados complexos no memcached, o cliente costumava fazer sempre a serialização do valor (o que é lento), mas agora com o cliente memcached você tem a opção de usar o igbinary . Até agora, não tive a chance de testar o quanto isso pode ser um ganho de desempenho.

Todos esses pontos foram suficientes para eu mudar para o cliente mais novo e posso dizer que funciona como um encanto. Existe essa dependência externa na biblioteca libmemcached , mas conseguiu instalá-la no Ubuntu e no Mac OSX, então não há problemas até agora.

Se você decidir atualizar para a biblioteca mais recente, sugiro que você atualize para a versão mais recente do servidor, além de alguns recursos interessantes. Você precisará instalar o libevent para compilar, mas no Ubuntu não houve muitos problemas.

Eu não vi nenhuma estrutura pegar o novo cliente armazenado em cache até agora (embora eu não os acompanhe), mas presumo que o Zend entrará em breve.

ATUALIZAR

O Zend Framework 2 possui um adaptador para o Memcached, que pode ser encontrado aqui


1
Excelente resposta; Além disso, a dependência externa do libmemcached é realmente uma vantagem, nesse caso, pois é um dos clientes mais ativamente desenvolvidos.
18119 Marc Bollinger

Acordado. A dependência externa do libmemcached não deve ser considerada um problema, mesmo que o libevent.
Miha Hribar

1
Essa coisa de Cas Tokens parece a maior vantagem. Na verdade, ao examinar esses recursos, quase parece que o memcached está indo mais para um detentor de dados gerenciados, como um banco de dados e menos como um cache temporário.
Xeoncross 18/09/09

Se você está procurando isso, você já possui o memcachedb ( memcachedb.org ), que na verdade é apenas um Berkley DB que fala o protocolo do memcached.
Miha Hribar

8
esta resposta nem diz a diferença entre memcache e memcached ?! O memcache é apenas a versão mais antiga do memcached?
Daniel W.


8

Estamos em 2013. Esqueça os comentários de 2009. Da mesma forma, se você estiver executando cargas de tráfego sérias, nem pense em como se contentar com um memcache baseado em janelas. Ao lidar com uma escala muito grande (mais de 500 servidores Web front-end) e mais de 20 servidores e replicadores de banco de dados back-end (mysql e mssql mix), um farm de servidores em cache (12 servidores em grupo) suporta vários aplicativos OLTP de alto volume, respondendo a 25K ~ 40K mc-> recebe chamadas por segundo. Essas chamadas são aquelas que NÃO precisam acessar um banco de dados.

IMHO, esse uso do memcached proporcionou economias SÉRIAS $$$, $$$ em CAPEX para novos servidores e licenças de banco de dados, bem como em contratos de suporte para grandes projetos comerciais.


48
Como isso responde à pergunta sobre as diferenças entre essas 2 implementações do protocolo memcache no php?
precisa saber é o seguinte

9
Isso deve ser um comentário.
Elias Lynn

7

Memcached é uma API mais recente, também fornece o memcached como um provedor de sessões, o que pode ser ótimo se você tiver um farm de servidores.

Depois que a versão ainda é muito baixa, 0,2, mas eu usei as duas e não encontrei um grande problema, então eu iria para o memcached porque é nova.


1
Os dois realmente funcionam como manipuladores de sessão, mesmo que eu nunca queira usá-los para isso. us3.php.net/manual/pt/memcache.examples-overview.php
Xeoncross

good catch my bad, sim, só é realmente útil em servidores grandes quando io se torna realmente importante, além de o memcache não validar que não será descartado algum objeto para obter memória tão difícil de saber como dimensionar as coisas.
RageZ

1
A versão 0.2 foi superada desde então por uma versão 1.0.0 estável.
21339 Miha Hribar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.