Cache de objetos com o Memcache

Filed Under (Performance) by admin on 23-09-2009

Tagged Under : , , , ,

O Memcached foi desenvolvido pela Danga Interactive para
atender ao livejournal.com um
site com mais de 20 milhões de acessos dinâmicos por dia.
Hoje ele é distribuido sob a permissive free software license e pode
ser baixado em http://danga.com/memcached/dist/

Pre-requisito

O Memcached utiliza a libevent, e caso seu sistma não possua esta biblioteca
você poderá baixa-la em http://www.monkey.org/~provos/libevent-1.4.8-stable.tar.gz
e seguir os passos:

tar xfz libevent-1.4.8-stable.tar.gz
./configure && make && sudo make install
sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib
Instalando o Memcached

wget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz
tar xfz memcached-1.2.6.tar.gz
cd memcached-1.2.6
./configure && make && sudo make install

OBS: O utilitário apt-get faz a instalação do memcached e da dependência libevent.
O comando é o sudo apt-get install memcached

Agora vamos roda-lo:
# (d = daemon, m = memory, u = user, l = IP to listen to, p = port)
memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211
verifique se ele está ouvindo na porta definida acima:
netstat -a | grep 11211

Suporte a linguagens

O memcached possui clients-api para:

- C/C++
- Erlang
- PHP
- Perl
- Java
- Phyton
- Ruby
- .NET
- MySQL
e outras http://code.google.com/p/memcached/wiki/Clients

Escolhi como exemplo o Ruby e o PHP e em ambos clients-api a “serialização” dos objetos é automática.

Memcached & PHP

apt-get install php5-memcache

verifique se a linha
extension=memcache.so não está comentada no arquivo /etc/php5/conf.d/memcache.ini

agora é só reiniciar o apache
/etc/init.d/apache2 restart

Fiz um código simples para acessar uma base de dados e retornar uma coleção da classe Pessoa:

teste.php

<?php

require “persistence/Entity.class.php”;

class Pessoa extends Entity {
 public $nome;
 public $endereco;
 public function to_string() {
  echo $this->nome.” - “.$this->endereco;
 }
}

$memcache=new Memcache;
$memcache->connect(’localhost’, 11211) or die(’Oops!’);

$pessoas = $memcache->get(’key’);

if (!$pessoas) {
 $pessoas = Pessoa::findAll(”nome”);
 $memcache->set(’key’,$pessoas,false,60);
}

print_r($pessoas);

?>

 
Ruby

sudo gem install Ruby-MemCache

Este exemplo em Ruby exibe outros recursos do Memcache como compressão de dados, debug e restrição de escrita.

teste.rb

require “rubygems”
require “memcache”
require “persistence.rb”

class Pessoa
 attr_accessor :nome, :endereco
 def to_s
  puts “#{nome} - #{endereco}”
 end
end

memcache_options = {
   :compression => true,
   :debug => false,
   :namespace => “mem-teste”,
   :readonly => false,
   :urlencode => false
}

memcache_servers = [ '127.0.0.1:11211' ]

CACHE = MemCache::new(memcache_options)
CACHE.servers = memcache_servers

pessoas = CACHE["key"]

if !pessoas
 pessoas = Persistence::findAll(”pessoas”, “nome”)
 CACHE["key"] = pessoas
end

puts pessoas

Das ist! um poderoso cache em minutos. ;-)