Navegación
-
Servicios
-
Noticias
- jQuery 1.4.2 Released
- Emulación de pseudo clases y selectores en IE
- Google lanza la primera versión 4.0 estable de Chrome para Windows
- Baidu gana el juicio contra IFPI
- Opera agrega soporte para CSS3 transiciones y transformaciones 2D
- Microsoft teme a OpenOffice y toman medidas
- Netbeans 6.8 listo para descargar
- Google borró una extensión para Chrome que permitía descargar videos desde YouTube
- Todas las noticias
-
Artículos
-
Descargas
-
Últimos 10 usuarios
-
Usuarios Top
-
Sitios recomendados
Web social
Tabla de contenidos
La tabla de contenidos pertenece al artículo completo y no al contenido parcial de cada página del mismo si fuese el caso.
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
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 installO bien, si tenemos Debian o "derivados", podemos instalar el paquete de Memcached desde el repositorio:
apt-get install memcachedUna vez instalado, iniciamos el servicio de Memcached así:
memcached -d -m 1024 -p 11211Con 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 foobarClientes 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 memcacheNos fijamos si está correctamente instalado:
php -m | grep memcacheNOTA: las dependencias no me acuerdo cuales son, pero creo que las pueden instalar con el paquete php5-dev:
apt-get install php5-devBueno, 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
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!
espero ver mas de estos por aca tambien
Agregar un comentario
Debe estar identificado para agregar un comentario
delicio.us
Google Bookmark
Technorati
Twitthis
Meneame
Yahoo My Web
Fresqui
Enchilame