Cargando la página...

Memcached

Publicado por Sherekan el 26/04/2009 en PHP - Nivel Básico

Tabla de contenidos

Avatar de

La tabla de contenidos pertenece al artículo completo y no al contenido parcial de cada página del mismo si fuese el caso.

Leer los comentarios.

Resúmen

Memcached es un sistema distribuído de cacheo de objetos en memoria, que suele usarse para mejorar la performance de aplicaciones web con mucho tráfico, ya que permite alivianar la carga a la base de datos, guardando el resultado de ciertas consultas en la memoria.

Sobre el autor

Avatar de Sherekan

Sherekan tiene 18 años y su ocupación es Programador.

Forma parte del club desde el 05/11/2007 habiendo estado en linea el 27/04/2009 09:36 por última vez.

Ha publicado 4 artículos en clubdesarrolladores con un promedio de valoración de 9.43 puntos. Puedes visitar su sitio web en http://sherekan.com.ar

Estadísticas

  • Leido 1111 veces
  • Valorado 9.50 puntos

Introducción


Como ya sabemos, una caché es un conjunto duplicado de otro conjunto de datos original, con la propiedad de que este segundo es más costoso de acceder (ya sea en tiempo o en recursos, etc.).

En sistemas con mucha concurrencia, es común que se haga muchas veces una misma consulta a la base de datos, obteniendo el mismo resultado.
Por ejemplo, imagínense un portal de noticias, en el cual en 1 hora entran 1000 usuarios que solicitan las noticias del día de hoy a la base de datos. ¿Tiene sentido que se hagan 1000 consultas idénticas a la base de datos? ¿cuánto pudieron haber variado las noticias en 1 hora...?

Bueno, en estos casos, se suele almacenar el resultado de la primer consulta realizada a la base de datos, en una caché. Y las consultas restantes, si son iguales, en vez de volver a hacerse, consultan el resultado directamente en la caché (sin tener que volver a acceder a la base de datos).

Claro que no siempre es una buena idea, y hay que saber donde y cuando implementar una caché, o de lo contrario estaríamos agregando un montón de overhead innecesario.

¿Qué es Memcached?


Memcached es un sistema distribuido de caché de objetos en memoria creado por Danga Interactive, que usa la memoria RAM como medio de almacenamiento.

A "groso modo" se trata de un servicio que escucha en determinado host y puerto, que es capaz de almacenar cadenas de bytes en memoria, mediante un par key/value dados.

Los clientes se conectan por TCP/IP al servicio de Memcached, y mediante un protocolo a nivel de aplicación con comandos bastante sencillos le ordenan a Memcached almacenar/recuperar cadenas de bytes en memoria.

Estas cadenas de bytes pueden ser cualquier cosa (estructuras de datos serializadas, XML, etc.).

Para identificar las cadenas se le especifica a cada una una key. Memcached mantiene una hash table con todas las cadenas de bytes mapeadas con sus respectivas keys.

¿Por qué usar Memcached?


Algunos podrán preguntarse si las bases de datos no implementan de manera nativa estas técnicas para mejorar su performance.
Bueno, claro que si, por ejemplo una de las features de MySQL es el "query cache", sin embargo tiene varias limitaciones, por ejemplo, sin entrar en detalles, el query cache de MySQL destruye la cache completa para una tabla cuando cualquier cosa de esa tabla es modificada...
Además, cuando la data devuelta por una consulta necesita un procesamiento "extra", MySQL no puede obviamente cachear eso...

El query caché de las bases de datos y Memcached se encuentran a diferentes niveles. No podemos compararlos, incluso podrían combinarse.

En conclusión, si la cantidad de datos que se necesitan cachear es pequeña, MySQL debería funcionar perfectamente. Pero sino, Memcached es lo que necesitamos.

Protocolo de Memcached


La API del protocolo de Memcached es bastante sencilla. Veamos los comandos más importantes:
set
Actualiza objeto si ya existe o lo agrega en caso contrario.
add
Agrega objeto sólo si no existe.
replace
Actualiza objeto sólo si existe.
get
Recupera objeto.
delete
Elimina objeto.

Recomiendo consultar la documentación del protocolo:
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

Instalación de Memcached


Podemos descargar Memcached de su sitio oficial: http://www.danga.com/memcached/
Lo compilamos e instalamos:
./configure
make
make install

O bien, si tenemos Debian o "derivados", podemos instalar el paquete de Memcached desde el repositorio:
apt-get install memcached

Una vez instalado, iniciamos el servicio de Memcached así:
memcached -d -m 1024 -p 11211

Con el parámetro -d le indicamos que se inicie como demonio, con -m la cantidad de memoria que puede utilizar y con -p el puerto en el cual escuchar.
Nos podemos conectar con telnet para probar si funciona:
telnet localhost 11211
set foo 0 0 8
lalalala
get foobar

Clientes para Memcached


Conociendo el protocolo de Memcached, que como pueden ver es bastante sencillo, podríamos crear nuestro propio cliente. Sin embargo ya existen clientes para varios lenguajes, como Perl, Python, Java, C, PHP, entre otros.

Ejemplo de Memcached con PHP


En este artículo vamos a ver la API que nos ofrece PHP para trabajar con Memcached.

Primero que nada tenemos que instalar Memcache (la librería de PHP para Memcached). Podemos instalar la última versión desde PECL:
pecl install memcache


Nos fijamos si está correctamente instalado:
php -m | grep memcache


NOTA: las dependencias no me acuerdo cuales son, pero creo que las pueden instalar con el paquete php5-dev:
apt-get install php5-dev


Bueno, vayamos a nuestro ejemplo. Creamos un objeto Memcache.
$memcache = new Memcache;

Llamamos al método connect() del mismo, pasándole como parámetro el host y puerto para conectarnos al servidor de Memcached.
$memcache->connect('localhost', 9000) or die('Could not connect');

Ahora creamos un objeto de prueba para almacenar en Memcached.
$test_obj = new stdClass;
$test_obj->attr1 = 1234;
$test_obj->attr2 = "foo";

Llamamos al método set() del objeto Memcache y le pasamos un string para identificar al objeto y la referencia al objeto que queremos guardar en Memcached.
$memcache->set('test', $test_obj) or die('Failed to save data at the server');

Ahora intentamos recuperar el objeto del servidor así.

$rs = $memcache->get('test');
var_dump($rs);


Es un ejemplo que no sirve de mucho. Pero por ejemplo una idea más interesante sería crear una especie de wrapper para la función mysql_query o extender PDO, para almacenar los resultados de las consultas a la base de datos en Memcached y consultarlos desde ahí.

Pueden consultar al documentación de la API de Memcached para PHP para más info:
http://ar2.php.net/memcache

Si tiene alguna pregunta sobre éste artículo por favor deje un comentario y será respondido.

Descargas

No existen descargas asociadas

Comentarios

Sus comentarios son importantes.

Listado de comentarios

1
27
abril
2009
avatar
Administrador aportó:
Siempre muy buenos tus artículos, muy elaborados y detallados, incluso con ejemplos!
Desconocía este servicio, se ve muy útil para sitios grandes con muchas consultas por minuto. Ya me pondré a probarlo en localhost y veré si puedo implementar algo asi para el club.
Saludos!
2
05
julio
2009
avatar
Jim Unikornian aportó:
Muy bueno, te sigo en tu blog tambien y siempre haces buenos tutoriales
espero ver mas de estos por aca tambien

Agregar un comentario

Debe estar identificado para agregar un comentario