Cache de objetos com o Memcache
Filed Under (Performance) by admin on 23-09-2009
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.

