Memcached, cache de objetos distribuido en RAM

Fecha: 12/10/2014
En Raiola Networks estamos especializados en la optimización de sitios web, por esa razón estamos habituados a trabajar con sistemas de cache que nos ayudan a mejorar la velocidad de carga de los sitios web y a crear infraestructuras escalables.
Normalmente en la mayoría de los sitios web se utiliza cache en disco, algo que es efectivo, pero que no es efectivo al 100% teniendo en cuenta que el acceso al disco duro puede tener un retraso importante incluso cuando usamos discos SSD.

Índice del artículo
  • Memcached Vs Memcache
  • Instalar Memcached en CentOS
  • Instalar Memcached en Debian
  • Configurar Memcached
  • Extensión Memcached para PHP en CentOS
  • Extensión Memcache para PHP en CentOS
  • Extensión Memcached para PHP en Debian
  • Extensión Memcache para PHP en Debian
  • Memcached y Nginx
  • Estadísticas de Memcached
  • Memcached para optimizar Wordpress
  • Memcached para optimizar Prestashop


Memcached te puede ayudar como cache de objetos o cache distribuido, sobretodo en instalaciones de mucho trafico donde se necesiten varios servidores para mantener la web online, y aunque últimamente Redis también se ha posicionado como una buena opción para cache de objetos distribuido, muchos seguimos prefiriendo Memcached ya que lleva mas tiempo en el mercado y en la mayoría de los casos existe mas compatibilidad con este sistema.

memcached

Para solucionar esto aparecen los sistemas como Memcached, un sistema de cache distribuido en memoria RAM que permite un acceso mediante sockets TCP.
El funcionamiento de Memcached es bastante sencillo, ya que los datos se guardan en una tabla hash distribuida donde se le asignan unos valores de identificación.

La arquitectura de funcionamiento de Memcached es cliente-servidor, existe un servidor que guarda datos y un cliente que tiene las ID que le permite acceder a los datos del servidor.

Con Memcached podemos montar infraestructuras muy escalables ya que podemos separar las otras partes del servidor de aplicación y base de datos de los servidores Memcached y aun así conseguir unos buenos tiempos de latencia en las conexiones si se utiliza en una misma red local o en un mismo nodo físico.

memcached

Algunos sitios web importantes como Youtube, Facebook o Twitter utilizan Memcached para optimizar el rendimiento y conseguir cachear los datos que tienen que enviar a los usuarios y visitantes.
En Google App Engine o en Amazon AWS podemos encontrar “Instancias” dedicadas a Memcached con una mínima latencia en las conexiones si utilizas como servidor de aplicación una de las “instancias” del servicio.

Memcached Vs Memcache


Son muchos los que buscan la diferencia entre Memcached y Memcache, pero pocos entienden que en realidad no existe diferencia ya que son cosas diferentes.

Como hemos dicho antes, Memcached tiene una arquitectura de funcionamiento de cliente-servidor, por lo que debemos distinguir las dos partes.
El siguiente esquema te ayudara a entender un poco mejor de lo que estamos hablando, teniendo en cuenta que hablamos de PHP:

memcached

Como servidor solo existe uno: Memcached. Pero como cliente para PHP esta MEMCACHED Y MEMCACHE, cada uno con sus características.

La primera versión de PHP-Memcache apareció en el año 2004, PHP-Memcached apareció usando PHP-Memcache como base en el año 2009, por lo que PHP-Memcache está mucho más actualizado y por eso consigue mayor velocidad de respuesta.

En esta tabla puedes ver todas las diferencias técnicas que puedes encontrarte entre Memcache y Memcached:

memcached

Pero resumiendo, según los benchmarks realizados por algunos de los sitios tecnológicos PHP-Memcached es un 16% más rápido que PHP-Memcache.

Instalar Memcached en CentOS


La instalación de Memcached es muy fácil en la mayoría de los sistemas operativos Linux, ya que Memcached está bastante extendido y sus paquetes se encuentran en todos los repositorios de paquetes oficiales.

En el caso de CentOS 5, CentOS 6 o CentOS 7 solo tenemos que ejecutar el siguiente comando para instalar Memcached:
yum install memcached

Con esto ya tendremos Memcached instalado, ahora vamos a configurar el servicio para que se inicie automáticamente al arrancar el sistema, para ello ejecutaremos el siguiente comando:
chkconfig --levels 235 memcached on

Y para arrancar el servicio de Memcached (servidor) ejecutamos el siguiente comando:
service memcached start

Con esto nuestro servidor Memcached estará listo para guardar y servir datos desde la memoria RAM.

Instalar Memcached en Debian


La instalación de Memcached en Debian, Ubuntu y otros sistemas operativos derivados tampoco es demasiado difícil, lo único que debemos hacer es ejecutar el siguiente comando para instalar Memcached desde los repositorios:
apt-get install memcached

Con esto Memcached estará instalado, podremos configurar Memcached para arrancar al inicio usando el siguiente comando:
update-rc.d memcached enable

Y arrancamos Memcached utilizando el siguiente comando:
/etc/init.d/memcached start

Como puedes ver, en Debian y derivados también es muy fácil instalar Memcached.

Configurar Memcached


La configuración de Memcached no es demasiado compleja, apenas nos deja configurar unos parámetros que son los que nos permitirán configurar nuestro sistema de cache distribuido.

Para editar el archivo de configuracion usaremos un editor de texto en consola como VI o NANO (recomendado), el archivo de configuración podremos encontrarlo en las siguientes rutas:

  • Para CentOS y relacionados:


nano /etc/sysconfig/memcached


  • Para Debian y derivados:


nano /etc/memcached.conf

Memcached solo tiene algunos parámetros básicos para definir, aunque es posible añadir nuevos parámetros al archivo de configuración:

  • PORT: Nos permite configurar el puerto que usaremos para responder las peticiones realizadas al servidor Memcached, el puerto por defecto es el 11211.

  • USER: Podremos configurar el usuario utilizado para abrir nuevos procesos de Memcached, por defecto el usuario es MEMCACHED.

  • MAXCONN: Este parámetro es importante ya que nos permite configurar el número máximo de conexiones concurrentes que permite el servidor Memcached, por defecto viene configurado en 1024 conexiones concurrentes. El máximo de conexiones concurrentes que podemos configurar es de 4096 conexiones.

  • CACHESIZE: Nos permite configurar la cantidad de memoria RAM asignada al servidor Memcached para guardar datos, por defecto está configurada en 64 MB de memoria RAM.

  • OPTIONS: Podremos configurar una dirección IP a la que se conectaran otros servidores externos como Nginx, y también podremos configurar otros parámetros como por ejemplo el numero máximo de threads o cores en los que se ejecutara el servicio o el numero máximo de procesos que se abrirán para gestionar el servicio.


Extensión Memcached para PHP en CentOS


Para utilizar Memcached en nuestro proyecto o sitio web PHP necesitaremos la extensión de Memcached para PHP, en CentOS podemos instalar PHP-MEMCACHED usando los siguientes comandos:
yum install php-pear
yum install php-pecl-memcached

Con esto ya podremos utilizar Memcached en aplicaciones web desarrolladas en PHP sobre CentOS.

Extensión Memcache para PHP en CentOS


También es posible instalar la extensión PHP-MEMCACHE en CentOS en lugar de PHP-MEMCACHED, para ello debemos ejecutar los siguientes comandos:

yum install php-pear
yum install php-pecl-memcache


Con esto si tenemos el servidor Memcached instalado podremos usarlo en nuestras aplicaciones PHP.

Extensión Memcached para PHP en Debian


Podemos instalar la extensión cliente de PHP para Memcached en Debian y derivados utilizando los siguientes comandos:
apt-get install php-pear
pecl install memcached

Con esto tendremos instalada la extensión de Memcached para PHP en el servidor Debian o derivados.

Extensión Memcache para PHP en Debian


También podemos instalar la extensión cliente de PHP Memcache para Debian y derivados, para ellos utilizamos el siguiente comando:
apt-get install php-pear
pecl install memcache

Ahora podremos utilizar la extensión memcache para PHP en nuestro servidor Debian.

Memcached y Nginx


Como ya hemos dicho en otro artículo, podemos usar Nginx como HTTP Cache, guardando los datos de cache en memoria RAM utilizando Memcached de forma nativa.

Nginx y Memcached hacen una buena pareja, consiguiendo unos tiempos de respuesta muy buenos y además consiguiendo hacer que el cache de Nginx se comporte de forma más eficiente, como se comporta el cache HTTP de Varnish.

Existe un módulo de Memcached para Nginx que nos permitirá guardar el cache de Nginx en Memcached, en el mismo o en distinto servidor.

Estadísticas de Memcached


Esto ya lo hemos comentado en otro artículo escrito en este blog, es posible obtener estadísticas de funcionamiento de Memcached utilizando un script desarrollado en PHP que obtiene datos de estadísticas recogidos por el servidor Memcached.

memcached

Un desarrollador ha querido hacer un fork del archivo de estadísticas de APC y lo ha hecho funcionar para Memcached con unos excelentes resultados e incluso con la posibilidad de obtener estadísticas de varios servidores Memcached al mismo tiempo.

También podemos obtener estadísticas de Memcached en Wordpress utilizando el plugin WP Memcached Manager.

Memcached para optimizar Wordpress


Aunque Wordpress no tiene implementación nativa con Memcached como lo tienen otros gestores de contenido, sí que podemos utilizar Memcached con Wordpress utilizando distintos plugins para guardar diferentes tipos de cache:

  • Flexicache: Nos permite guardar en Memcached el cache de página usando la extensión Memcache para PHP.

  • W3 Total Cache: Nos permite guardar en Memcached el cache de página, el cache de objetos, el cache de base de datos y los archivos estáticos minificados. Para ello puede usar tanto la extensión Memcache como la extensión Memcached para PHP.

  • EM Object Cache: Nos permite guardar en Memcached el cache de objetos.

  • WP-FFPC: Nos permite guardar en Memcached el cache de página usando tanto PHP Memcached como PHP Memcache.


Lamentablemente este tipo de servicios de cache solo son totalmente funcionales y eficientes en servidores VPS o servidores dedicados, ya que aunque en hosting compartido es posible ofrecerlo, realmente su rendimiento deja bastante que desear y no se acerca para nada al rendimiento que puede obtenerse en un servidor VPS o dedicado.

Si necesitas ayuda para implementar Memcached en tu web Wordpress puedes contactar con Raiola Networks y te informaremos sin compromiso.

Memcached para optimizar Prestashop


Prestashop es un gestor de contenidos muy complejo, y por esa razón es necesario utilizar un cache para reducir el consumo de recursos y aumentar la velocidad de carga del sitio web.
Prestashop lleva implementado por defecto un cache en disco que puede llegar a ser bastante ineficiente al leer y escribir datos continuamente en el disco duro, además, puede llegar a ocupar mucho espacio y muchos “inodos”.

Es posible utilizar Memcached para almacenar el cache de Prestashop de forma efectiva, para ello es necesario utilizar la extensión Memcached para PHP.

Si necesitas ayuda para implementar el cache de Prestashop en Memcached puedes contactar con nosotros sin compromiso y te informaremos.
Álvaro Fontela
Álvaro Fontela

Alvaro Fontela es consultor WordPress especializado en WPO y rendimiento web, además de co-fundador y CEO de Raiola Networks.

Artículos relacionados

Si te ha gustado este post, aquí tienes otros que pueden ser de tu interés. ¡No dejes de aprender!

Tenemos 9 comentarios en Memcached, cache de objetos distribuido en RAM
Avatar del autor del comentario

AutoCultivo

26/02/2017 a las 00:09

Como siempre Alvaro te sales con tus tutoriales, excelente aporte, normal nº1 en google.

Quiero editar el archivo con nano /etc/sysconfig/memcached y me dice que el directorio no existe. ¿ con 64mb por defecto? +nginx en vesta me llegará para cachear las paginas con w3 total cache? De momento vá como una bala sirve 4,4 mb de web entre 1.56 y 2.16 segundos.

Tengo configurado para object cache xcache y para page cache el mencached en w3 total cache, además tengo zend opcache como Opcode Cache. ¿ Te parece buena combibación? ¿ o te parece mejor page cache en disco ssd?

Muchisimas gracias.

Responder
Avatar del autor del comentario

AutoCultivo

26/02/2017 a las 02:17

Solucionado con este comando en vez de nano usé vi
vi /etc/sysconfig/memcached

Puse de valores max conections 4096 y cache size 1024

¿ Que te parece así?

Responder
Avatar del autor del comentario

Alvaro Fontela

01/03/2017 a las 12:44

Hola, perdona que no te contestara antes, llevo unos dias largos.

Normalmente cuando trabajo con VPS o servidores pequeños configuro Memcached con los parámetros a la alza, al menos en lo de conexiones, que siempre las pongo al máximo, ya que un Wordpress con poco trafico y sin cientos de miles de paginas no va a llegar a usar tantas conexiones.
En cuanto al cache size, suelo ponerlo en un tamaño adecuado al tamaño del sitio web y la RAM del VPS, tampoco es bueno pasarse, ya que puede haber problemas de RAM si llega al tope.

Un saludo.

Responder
Avatar del autor del comentario

Carlos Alberto Julián Sánchez.

11/11/2017 a las 04:55

Álvaro, yo tengo un VPS con ustedes. ¿ya viene instalado la caché? además de eso en una web uso Wp super Caché y Optimize.

Responder
Avatar del autor del comentario

Héctor Luaces

05/04/2018 a las 22:40
Hola, Carlos.Memcached viene instalado y listo para usar en nuestros VPS optimizados: enlace (del VPS SSD2 en adelante).Si tienes un VPS normal puedes instalar memcached y usarlo sin problemas, pero ¡ojo!, Super caché no puede usar memcached, solo usa caché de página en disco. Para eso tendrás que usar otros plugins, como explicamos en el artículo.Cualquier cosa nos dices.Un saludo.
Responder
Avatar del autor del comentario

Manu López

12/12/2017 a las 13:46

Gracias por el artículo. Me queda clara la arquitectura e instalación de MemCached.

Lo que no tengo tan claro es como hacer uso de esta ventaja en una aplicación Web PHP.

¿La aplicación comienza a hacer uso de esta caché de forma automática al arrancar el servidor MemCached?

¿O es necesario adaptar el código fuente PHP para hacer uso expreso de este servicio indicando qué información se quiere cachear? (En este caso conllevaría modificar toda la lógica del programa, algo bastante costoso en aplicaciones grandes ya desarrolladas)

Gracias.

Responder
Avatar del autor del comentario

Héctor Luaces

05/04/2018 a las 22:35

Hola, Manu.

Si tienes una aplicación a medida no comienza a usarla porque tienes que programarla para que lo haga.

En principio no debería ser muy costoso. Tienes que localizar las partes de la aplicación que son propensas a hacer consultas largas o ejecutar funciones de coste computacional alto y allí usar las funciones de memcached de PHP. Puedes verlas aquí: http://php.net/manual/es/bo...

Un ejemplo de código sería el siguiente. Imaginate que la funcion "obtener_articulos()" hace una consulta a un proveedor externo para conseguir muchos productos.

Si necesitases ayuda o código de ejemplo para saber como implementarlo, coméntamelo y veo de pasarte ejemplos.

Un saludo.

Responder
Avatar del autor del comentario

Saul Cesar

09/07/2020 a las 21:55
Hola, una consulta, cómo puedo ver la información en crudo que está almacenada en el servidor de caché?
Responder
Avatar del autor del comentario

Alvaro Fontela

12/07/2020 a las 21:22
Hola, con herramientas como phpmemcachedadmin podrías hacerlo, aunque es complejo sacar algo en limpio, ya que muchas cosas que se almacenan son variables y cosas que por si solas no dicen nada, y tampoco hay una referencia real y que se pueda entender.
Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *