Memcached – Cache, escalável e eficiente

Logo do MemcachedMesmo com a web dinâmica que temos hoje, é possível reaproveitar o conteúdo de muitas consultas ao banco de dados sem ter o mínimo receio. Isso acontece pois, mesmo com o conteúdo mudando frequentemente durante um dia, por exemplo, é comum haver muitas requisições que simplesmente apenas pegam o conteúdo repetido, sem modificações. Imagine por exemplo um site de notícias: Mesmo com várias notícias sendo postadas diariamente, há uma certeza quase exata: As categorias pelos quais as notícias são classificadas, como economia e política, por exemplo, não mudam com tanta frequência de nome e identificador. Assim, as categorias se tornam um excelente candidato a serem cacheados, e é possível evitar consultas ao banco de dados facilmente apenas registrando-as elas em algum sistema de cache. Hoje, vou falar um pouco sobre mais nada menos do que o mais popular sistema de cache usado atualmente: O Memcached.

O Memcached é hoje, o sistema de cache mais popular e fácil de usar disponível atualmente. Com drivers para inúmeras linguagens e simplicidade impressionante, ele cumpre muito bem a tarefa para o qual foi criado: Cachear dados.

Inclusive, sua simplicidade merece destaque neste post, pois o Memcached possui pouquissimos dados que, além de tornar o software muito simples, facilitam a implementação do cache no seu programa. Segue abaixo uma descrição básica de algumas das operações que o protocolo do Memcached permite, e que existem na maioria (senão em todos) os drivers implementados para se comunicar com o Memcached:

  • set – Configura uma chave e valor no cache, definindo também um periodo de expiração (se necessário);
  • add – Configura uma nova chave e valor no cache, definindo também um período de expiração, se necessário. A diferença desta operação para a operação set é que o add só configura a nova chave e valor se a chave especificada ainda não existir no cache;
  • replace – Substitui o valor de uma chave já existente no cache;
  • append – Adiciona o valor informado ao final do valor já presente em uma chave no cache. Como no Memcached todos os valores são strings, no final essa operação somente faz uma concatenação do valor que você informou com o valor que já estava presente na chave que você informou e que já estava presente no cache;
  • prepend – Faz a mesma coisa que o append, exceto que adicionando o valor informado no inicio do valor já presente no cache, e não no final;
  • cas – Operação que armazena dados, mas somente se o dado não tiver sido alterado desde a última vez que você leu. Permite resolver problemas complexos envolvendo condições de corrida e atualização do cache;
  • get – Permite pegar um valor armazenado no cache a partir de uma chave informada;
  • gets – Mesma coisa que o get, mas permite pegar várias chaves ao mesmo tempo;
  • incr – Dado uma chave já existente no cache, se o valor correspondente a essa chave for a representação em string de um inteiro de 64 bits, essa operação permite incrementar esse inteiro, armazenando o valor no cache;
  • decr – Mesma coisa que o incr faz, exceto que fazendo a operação de decremento;

Tem mais algumas operações relacionadas a captura de estatísticas e limpeza do cache que estão disponíveis no protocolo também, só que, no fim das contas, são operações tão pouco usadas por aplicações que resolvi não incluir aqui. Além disso, dentre todas essas operações, as mais comuns de serem usadas são a get e a set, que trabalham num esquema similar a esse (representei em um Python bem simples, mas dá para entender bem o exemplo):

Note que, para o código acima funcionar, seria necessário instalar, importar e configurar o driver do memcached para Python e também criar uma função fetch_foo_from_database. Mas já dá para entender bem como seria o uso do cache numa aplicação normal.

Além disso, ele é usado por sites bem conhecidos no mundo da tecnologia, entre elas:

  • Twitter;
  • Youtube;
  • WordPress.com;
  • Wikipédia;
  • etc.

Isso porque o Memcached oferece ótimo desempenho (por funcionar 100% em memória, daí o nome memcached) e vários de seus drivers permitem o uso de clusters de cache (ou seja, a distribuição do cache para várias máquinas), permitindo uma escalabilidade horizontal do cache e suportando assim qualquer número de visitas com muita facilidade.

Gostou do conteúdo desse post? Apoie o blog pagando a partir de R$1/mês através da nossa página no Apoia.se! Isso me ajudará a manter o blog no ar, além de trazer mais coisas legais para vocês! Obrigado desde já! 😀