Otimizando sua aplicação com Memcached

otimize-sua-aplicacao-com-memcached

 

Nos padrões web de hoje, vemos sites e aplicações cada vez mais ricas em interatividade e cada vez mais rápidas. E graças à internet banda larga (que aqui no Brasil não é lá essas coisas, mas ainda é bem melhor que a internet discada), estamos ficando cada vez mais acostumados com essa velocidade entre cliques e carregamento de páginas. Se entrarmos em um site e este demorar pouco mais de um ou dois segundos para carregar, já começamos a ficar angustiados (mesmo que inconscientemente) e a considerar, numa fração de segundo, a hipótese de fechar aquele site e partir para outro. Isso acontece bastante comigo quando estou fazendo pesquisas. Calcule agora o número de possíveis clientes ou novos contatos que perdemos por culpa da nossa aplicação que não está de acordo com o padrão de velocidade que o usuário espera hoje em dia..

 

Eu gosto de começar com uma breve introdução sobre o assunto abordando situações reais do nosso dia-a-dia, pois acredito que assim fica mais claro o por quê de estar escrevendo a respeito dele. Hoje pretendo falar e apresentar exemplos sobre a poderosa ferramenta de cacheamento chamada Memcached. Por favor, não confundam com Memcache (sem o “d” no final), que é outra biblioteca com o mesmo propósito, mas no contexto geral é inferior ao MemcacheD. Entre as principais diferenças que se tem comparando as duas ferramentas, cito a incrível possibilidade do Memcached de guardar seus objetos cacheados em um servidor diferente do qual você está desenvolvendo. Mas peraí, ainda nem falei o que é o Memcached e já estou falando de armazenamento de objetos cacheados no servidor, hehehe.. Calma, vamos partir do começo então…


 

O Que é o Memcached?

Segundo o site da própria biblioteca, o Memcached nada mais é do que um Sistema de Cache de alta performance, que serve para armazenar dados diretamente na memória do sistema, para acesso fácil e rápido posteriormente. Palavras do Memcached: “Pense nisso como uma memória de curto prazo na sua aplicação”. Basicamente ele permite à você retirar memória de um lugar que está sendo pouco usada e aplicá-la em outro lugar com mais volume de informações e processamento.

 

Me explique mais, por favor.

Claro! Imagine a seguinte situação: Você possui dois servidores na Amazon, por exemplo. Em um deles você tem 256 MB de memória, e no outro mais 256 MB. O primeiro servidor é responsável pelo seu site e o segundo pelo seu sistema (o banco de dados estaria em um terceiro servidor, mas não vem ao caso). Seu site é bem acessado, mas mesmo assim não chega nem perto de utilizar todo o potencial do seu servidor. Em compensação seu sistema é muito utilizado, pois há os funcionários da empresa, os clientes via extranet, e todos os parceiros via webservices. Você até usa um sistema de cacheamento para tentar amenizar a situação, mas está chegando em um nível que não há mais o que fazer. Sua memória já está no limite e a única alternativa é desembolsar uma grana a mais e fazer upgrade no seu plano com a Amazon para ter mais memória. Sim, é uma alternativa. Mas pode haver outra. E o Memcached proporciona isso. Ao invés de cachear as informações do seu sistema no próprio servidor, você pode (e essa é a grande vantagem do Memcached para o Memcache) direcionar seu cacheamento para outro servidor, desafogando o server do sistema e melhor aproveitando os recursos não utilizados do server de seu site. Veja abaixo a imagem (tosca) que eu fiz para tentar ilustrar essa ideia:

memcached

 

Mas como eu configuro tudo isso?

Não é difícil. Primeiramente você precisa instalar a biblioteca em seu servidor. Peguemos como exemplo um servidor Linux. Pelo terminal e como “root”, você deve executar os seguintes comandos:

 

apt-get install memcached
apt-get install php5-memcached

service memcached restart
service apache2 restart

Linha 1: instalando a biblioteca Memcached
Linha 2: instalando o módulo do PHP para uso do Memcached
Linha 4: reiniciando o serviço do Memcached
Linha 5: reiniciando o servidor Apache

 

Pronto, neste momento você já tem tudo que precisa para começar a brincar com o Memcached. Agora vamos ver como realmente implantá-lo em seus códigos.

 

Criando e configurando o objeto Memcached

Considere a hipótese de estarmos trabalhando apenas com o Memcached no próprio servidor. Para fins didáticos, esse caso é o ideal. Vamos começar com a instância e configuração do Memcached. Observe:

 

$m = new Memcached;
$m->addServer('127.0.0.1', 11211);

Linha 1: Instanciando o Memcached, e armazenando-o na variável $m.
Linha 2: A função addServer() nos permite definir em qual servidor o Memcached rodará. O primeiro parâmetro é o IP deste servidor (no nosso caso, local) e o segundo parâmetro é a porta sobre qual o Memcached opera. Por padrão é a 11211.

 

Guardando valores na memória

O básico primeiramente: vamos armazenar algo na memória? Veja:

 

$m->set('mascote', 'Tux, o Pinguim');

echo $m->get('mascote');

Linha 1: Sobre o objeto do Memcached, utilizo a função set() para armazenar algo na memória. O primeiro parâmetro é a chave e o segundo é o valor a ser armazenado nesta chave.

Linha 3: Com a função get(), conseguimos recuperar através da chave o valor armazenado na memória. Veja que o exemplo acima está imprimindo “Tux, o Pinguim” na tela.

 

Definido tempo de expiração

A função set também aceita um terceiro parâmetro, sendo este o tempo de expiração do valor armazenado. Ideal para, por exemplo, políticas de login e autenticação, onde um usuário inativo por X minutos deve ser deslogado do sistema. Observe como é fácil.

$m->set('temp', 'item qualquer', time() + 30);

 

Linha 1: repare que a função é a mesma, e os dois primeiros parâmetros foram passados normalmente. O que alterou foi a entrada de um terceiro parâmetro, que define através de “time() + 30” o limite de 30 segundos para este valor ficar armazenado na memória. Após isto, ele é destruído. O valor deve ser passado em segundos.

 

Caso seja necessário renovar este tempo, use a função touch() para isto. Veja:

$m->touch('temp', time() + 120);

Linha 1: Agora acabamos de aumentar em 2 minutos o tempo de expiração do valor armazenado na chave “temporario”.

 

Manipulando o valor dentro de uma chave

Podemos também querer redefinir um valor armazenado na memória. Pode-se usar o set() novamente, passando a chave e o novo valor, mas é boa prática utilizar a função replace() para este caso. Veja:

$m->set('mascote', 'Pinguim');
echo $m->get('mascote');

$m->replace('mascote', 'Elefante');
echo $m->get('mascote');

 

Linha 1 e 2: Definimos e apresentamos o valor da chave ‘mascote’ na memória. Neste momento, será impresso na tela “Pinguim”.

Linha 4: Estamos sobrescrevendo o valor de ‘mascote’ com a função replace().

Linha 5: Agora irá aparecer na tela o valor “Elefante”, e não mais “Pinguim” como anteriormente.

 

Uma coisa interessante é a possibilidade de concatenar conteúdo dentro das chaves. Existem as funções append() e prepend() que nos possibilitam isto. Veja o exemplo:

$m->setOption(Memcached::OPT_COMPRESSION, false);

$m->set('frase', 'O Grande');
echo $m->get('frase');

$m->append('frase', ' Pinguim');
echo $m->get('frase');

$m->prepend('frase', 'Venere ');
echo $m->get('frase');

Linha 1: a função setOptions() serve para definirmos diversas opções em tempo real no objeto do Memcached. Aqui estamos desabilitando a compressão dos valores setados, para podermos usar as funções append() e prepend() descritas abaixo. Sem desabilitar esta compressão feita por padrão pelo Memcached, as funções não irão funcionar.

Linhas 3 e 4: Isto você já decorou.

Linha 6: Com a função append(), estou concatenando a string “ Pinguim” no final do valor de “frase”.

Linha 7: A impressão na tela será “O Grande Pinguim”.

Linha 9: Com a função prepend(), estou concatenando a string “Venere ” no início do valor de “frase”.

Linha 10: Agora, a impressão na tela será “Venere O Grande Pinguim”.

 

E agora, vamos excluir de vez o valor de “frase” da memória.

$m->delete('frase');

Com o comando acima, eliminamos qualquer vestígio deste valor na memória. Indicado fazer isto com itens que não mais será usado na aplicação, pois vai liberando memória para outros itens.

 

Verificando todas as chaves criadas na memória

O Memcached disponibiliza uma função para pegarmos todas as chaves ativas criadas na memória. Veja o exemplo abaixo:

$chaves = $m->getAllKeys();

foreach ($chaves as $chave) {
    echo = $m->get($chave);
}

Linha 1: Usamos a função getAllKeys() para capturar todas as chaves ativas armazenadas em memória.

Linha 3: Este foreach() vai “loopar” o array retornado pela função getAllKeys(). Aqui faz-se o que precisar. No exemplo, apenas apresentei na tela cada um dos itens armazenados em memória.

 

Encerrando a conexão

Veja as funções abaixo:

$m->flush();

$m->quit();

Linha 1: A função flush() invalida todos as chaves criadas na memória. Ela apenas invalida, não apaga. Os itens continuam ocupando espaço na memória. Sinceramente ainda não consegui achar uma ocupação útil para esta função, mas aí está ela.

Linha 3: a função quit() fecha todas as conexões do Memcached com a memória. Para aqueles que trabalham ou já trabalharam com sessão, seria mais ou menos como o session_destroy().

 

Conclusão

Acredito que com estes exemplos você já pode começar a trabalhar com o Memcached e usufruir de todo o benefício que ele proporciona para sua aplicação. Vale lembrar que ele não armazena simplesmente strings, mas também arrays, objetos, e tudo o mais que você precisar. Imagine agora o quão otimizado ficará seu sistema se você cachear em memória (onde o acesso é extremamente rápido) consultas realizadas constantemente em seu banco de dados. Apenas uma consulta será feita, e acessada muitas vezes por diversos usuários. Isso diminui o tempo de espera da resposta do banco de dados, a transferência de dados entre o servidor / cliente e ainda por cima, por estar na memória, o acesso à ela é extremamente mais rápido do que se estivesse armazenado em qualquer outro lugar.

 

Espero que tenham gostado do tópico, e peço que deixem suas opiniões ou experiências com este ou com outros sistemas de cache (tenho curiosidade em estudar o Redis, mas falta tempo…). E se tiverem dúvidas, por favor comentem aí e vamos tirá-las o mais breve possível!!

 


Marcado com: , , , ,
Publicado em Desenvolvimento, Produtividade, Tecnologia
Volte Sempre!
Meus artigos te ajudaram de alguma forma e você não sabe como me agradecer? Que tal me pagar uma Coca-Cola bem gelada?

Sobre o autor

Me chamo Ricardo Brusch, sou programador e desenvolvedor de sistemas para internet. Também sou aspirante a escritor, e você pode ler alguns de meus contos malucos em contos.ricardobrusch.com.br.
Parceiros





Publicidade