DevSecOps

20 mai, 2014

Turbine sua aplicação com o Memcache

Publicidade

Consultar a base de dados para coletar as mesmas informações sempre que um visitante acessa, prejudica muito a performance. Dependendo da quantidade de usuários simultâneos, a sua aplicação pode ficar indisponível (normalmente devido as requisições a base de dados).

Uma estratégia para turbinar sua aplicação e garantir a alta disponibilidade com ganho de performance é criar cache das informações que são regularmente consultadas. Para isto vamos utilizar o memcached, um software projetado para utilizar a memória RAM como cache.

O memcached foi desenvolvido por Brad Fitzpatrick em 2003 para atender a alta demanda de acessos do site Livejournal, mas o Facebook, que tirou o maior proveito da tecnologia, em 2005, implantou o memcached em sua infra estrutura, que colaborou para a grande escalabilidade. Hoje o Facebook possui estimadamente mais de 800 servidores e 28TB de memória sendo utilizados como cache.

Memcached vs. Memcache

Normalmente gera uma grande confusão… É memcached ou memcache?

Memcache é o módulo que fornece a relação processual e orientada a objeto para o memcached, cache daemon altamente eficaz, que foi especialmente projetado para reduzir a carga de banco de dados em aplicações dinâmicas.

Memcached é o software de alta performance. Memória distribuída baseado em sistema de cache de objeto, de natureza genérica, mas destinado a ser utilizado para acelerar aplicações dinâmicas, aliviando a carga do banco de dados.

Neste artigo vamos abordar a instalação e a utilização do mamcached na prática. Para isso utilizamos a arquitetura LAMP – porém o memcached pode ser utilizado em diversas outras linguagens e sistemas operacionais.

Só para deixar claro, todos os procedimentos foram realizados com a distribuição Linux Debian 6.0 ( Squeeze ).

Antes de começar, é uma boa ideia atualizar o apt-get e garantir que todos os pacotes da distribuição estejam atualizados:

sudo apt-get update

Se você ainda não tiver o PHP e MySQL instalado execute:

sudo apt-get install mysql-server mysql-cliente php5 php5-mysql

Instalando o Memcached

Extensão do PHP Memcache:

sudo apt-get install php5-memcache

Agora, instale o memcached via apt-get:

sudo apt-get install memcached

A próxima etapa é instalar o PEAR ( PHP Extension and Aplication Repository ), um repositório com diversos componentes para o PHP.

sudo apt-get install php-pear

Instale o Build Essential, caso ainda não tenha instalado na sua distribuição.

sudo apt-get install build-essential

Finalmente iremos utilizar o PECL (PHP Extension Community Library) para instalar o memcache.

sudo pecl install memcache

Depois de concluída a instalação do memcache com o PECL, crie o arquivo memcache.ini dentro do diretório onde ficam os arquivos de configuração dos módulos do PHP:

echo "extension = memcache.so" | sudo tee /etc/php5/conf.d/memcache.ini

Pronto, agora você está pronto para começar a utilizar o memcache.

Verifique se ele foi instalado corretamente procurando-o:

ps aux | grep memcache

Você pode ver as estatísticas do memcache com o seguite comando:

echo "stats settings" | nc localhost 11211

Memcached na Prática

O nosso objetivo é recuperar as informações sem precisar consultar a base de dados. Somente se as informações não estiverem cacheadas iremos consultar a base de dados e após armazenar as informações em cache para as futuras consultas.

Conectando com Memcached

// Constantes necessárias para conexão

define('MEMCACHED_HOST', '127.0.0.1');
define('MEMCACHED_PORT', '11211');

// Objeto / Conexão

$memcache = new Memcache;
$cacheAvailable = $memcache->connect(MEMCACHED_HOST, MEMCACHED_PORT);

Armazenando as informações

// Validamos o conteúdo das variáveis
// Escapamos o conteúdo das variáveis com mysql_real_escape_string()
// Escrevemos as informações na base de dados:

$sql = "INSERT INTO products (id, name, description, price) VALUES ($id, '$name', '$description', $price)";
$query = mysql_query($sql, $db);

if ( $query === true )
{

	// Para identificar o produto, precisaremos criar uma chave única para o array associativo
	// Utilizaremos a palavra 'product' mais o id do produto (ex. "product_12")

	$key = 'product_' . $id;
 	$product = array('id' => $id, 'name' => $name, 'description' => $description, 'price' => $price);

    // Para realizar o amazenamento em cache, invocaremos o método "set" do objeto $memcache.

    $memcache->set($key, $product);

}

Recuperando as informações

// Inicializamos a variável $product

$product = null;

// Inicializamos a variável $key

$key = null;

// Verificamos se o servidor de cache está disponível checando se a variável $cacheAvailable foi inicializada

if ( $cacheAvailable )
{

    // Construimos a chave do array associativo para obter as informações do produto

    $key = 'product_' . $id;

}

// Checamos se não existe o cache referente ao produto
// Se não existir as informações em cache, iremos consultar a base de dados

if ( !( $product = $memcache->get($key) ) )
{

    // Buscamos as informações do produto na base de dados

    $sql = "SELECT id, name, description, price FROM products WHERE id = " . $id;
    $queryResource = mysql_query($sql, $db);
    $product = mysql_fetch_assoc($queryResource);

/**

Aqui você deve incluir a rotina para armazenamento das informações obtidas do MySQL, na próxima consulta as informações estarão em cache e não precisará consultar a base de dados novamente.

**/
}

Para conhecer todos os métodos disponíveis da classe memcache, acesse : http://www.php.net/manual/en/class.memcache.php

Conclusão

Acelerar a recuperação das informações é o fator essencial para obeter a alta performanc. Com o memcached podemos estruturar excelentes arquiteturas de cache em memória RAM utilizando um ou muitos servidores. Ao utilizar o memcache não espere substituir ou armazenar todas as informações na memória, opte sempre por armazenar as informações que são mais relevantes e que produzam realmente o ganho na performance da aplicação.