Evitar tener varias instancias de memcache

Tuvimos un problema al tratar de centralizar una aplicación web que corría en varios dominios, lo que sucedía era que las KEYs del memcache eran exactamente iguales en todos los dominios pero los datos que debían contener esas KEYs eran diferente, obviamente porque eran sitios diferentes solo que con el mismo código fuente.

La solución que se nos ocurrió para evitar tener varias instancias de memcache ejecutadas en el servidor gastando memoria fue la de agregar un Prefijo parametrizado según el dominio en el que se crea la KEY.

Este es un ejemplo del código actual que tenemos

define("PREFIJO","app1"); //este es el parametro que se configura según cada dominio
$memcache= new Memcache();
$memcache->connect("localhost",111112);
$key=PREFIJO."nombre_llave";
$memcache->set($key,$datos,false,60*60);

Luego para leer sería:

$key=PREFIJO."nombre_llave";
$memcache->get($key);

Espero que les sirva como nos sirvió a nosotros 🙂

Memcache + PHP

¿Por qué memcache?
En muchos proyectos de software (incluyendo Web) se realizan consultas a la base de datos que un lapso de tiempo siempre arrojan el mismo resultado; pero como no teníamos con una forma de almacenar esa información para disponer de ella cada vez que la necesitamos sin tener que realizar la consulta en el motor de bases de datos nuevamente, entonces simplemente llamábamos un query X cantidad de veces sin importar los recursos que tomaba la ejecución de dicha consulta. Con el fin de evitar ese desperdicio de recursos es que ha nacido memcache.

¿Qué es memcache?
Memcache es un servicio para almacenar objetos en memoria RAM y que pueden ser utilizados por múltiples procesos sin importar si se encuentran en la misma máquina o no. El objetivo principal por el que surgió memcache es el de evitar peticiones incesarías a la base de datos.

¿Cómo lo instalo y configuro?
Para unix:
$ sudo apt-get install memcached
$ sudo /etc/init.d/memcached restart
$ sudo apt-get install php5-memcache

Activar la extensión editando el archivo /etc/php5/conf.d/memcache.ini y descomentando la línea extension.
; uncomment the next line to enable the module
extension=memcache.so

Por último reiniciar apache

Para Windows:
Bajar e instalar: http://allegiance.chi-town.com/MemCacheDManager.aspx

Activar la extensión editando el archivo  G:\wamp\bin\php\php5.2.6\php.ini  y descomentando la línea extension.
extension=php_memcache.dll

Por último reiniciar apache

Memcache es un servicio/daemon que se ejecuta por consola de la siguiente manera:

/usr/bin/memcached -d -m 2048 -u root
-d : corre como servicio.
-m : limite de memoria en MB que le permitiremos usar a memecache
-u : identidad de quien ejecuta el proceso
-p : puerto (por default es 11211)
-c : limite de conexiones simultaneas (default es 1024)
-h : muestra ayudas y otros parámetros de uso

¿Cómo lo uso?

function memcache_test(){
   $memcache = new Memcache();
   $memcache->connect("localhost",11211);
   $key = "todos_los_registros_de_tabla_datos";
   $datos = $memcache->get($key);
   if (!$datos){
      echo "No esta cachado... hitting db e insertando en  memcache. <br>";
      $result = mysql_query("SELECT * FROM datos");
      while( ($dato=mysql_fetch_assoc($result))!=null){
         $datos[]=$dato;
      }
      $memcache->set($key,$datos,false,60*60*24); //cachados  por 24 horas
      print_r($datos);
   }else{
      echo "Ya se encuentra en memoria:<br>";
      print_r($datos);
   }
}

Gracias luis por la info