Memcached en PHP

tutorial memcached php mysql gratis

Hoy voy a escribiros un artículo introductorio a la Memcached usando PHP. Intentaré explicarlo para usuarios nobeles que quieran aprender las bases de Memcached, pero bueno... empecemos por el principio.

¿Qué es la Memcached?

Memcached es un sistema distribuido de propósito general para caché basado en memoria. En palabras más sencillas lo que esto viene a decir es que es un sistema de almacenamiento de datos en memoria. Se usa principalmente para evitar hacer consultas a la base de datos cuando tenemos muchos accesos a nuestra web de forma concurrente.

Hay que tener en cuenta que memcached guarda los datos en memoria en una tabla hash NO PERSISTENTE, es decir, que tenemos que tener los datos reales en una base de datos o en otro sistema persistente. La Memcached se usa para evitar acceder a disco (y a base de datos), pero no puede usarse "en lugar de" disco. La caducidad en caché depende del tiempo de permanencia ya que según se llene la Memcached, se irá liberando espacio borrando los datos más antiguos.

¿Cómo puedo usar la memcached?

Yo conozco dos formas de usar la memcached:

La primera y más obvia es usar la memcached para almacenar los resultados querys de base de datos típicas. Es decir, podemos guardar en base de datos un select de la base de datos en formato json. Esto no puede hacerse siempre porque obviamente no podemos (o no debemos) almacenar en Memcached todas las querys posibles de cualquier tabla. Quizá tiene sentido usar Memcached para almacenar los datos más usados y que sepamos no pueden crecer demasiado la casuísitica de las querys. Es decir, no tiene sentido almacenar datos que dependan de varios filtros AND y OR porque el tamaño crece inmensamente, aunque sí puede tener sentido almacenar datos que dependan de un sólo parámetro.

 La segunda y quizá más extraña es almacenar datos independientemente de queries inventándonos nuestro propio formato de datos. En este caso el paso lógico es guardar los datos en una estructura parecida a memcached pero que sea persistenta, para que así a la hora de recuperar los datos podamos mantenerlo en disco con el mismo formato. Yo conozco Toky

Almacenar y recuperar en mencached querys de bbdd con PHP

Para recuperar los datos de memcache vamos a usar un ejemplo de una tabla de usuarios de mysql

class userBean(){
   protected $claveMC = "UserID::";
function _construct(){
   $mem  = new Memcached();
   $mem->addServer('127.0.0.1',11211);
}
function getUserData(idUser) {
   // La clave de la mem
    $result = $this->mem->get($this->claveMC.$idUser);
    if (!result) {
         // no se ha encontrado en memcached, se consulta la base de datos 
         $result = db_select("SELECT * FROM users WHERE userid = ?", userid);
         $result = json_encode($result);
         // almacenamos en la cache
         memcached_add($this->claveMC.$idUser, $result);
     }else{
         $result=json_encode($result);
     }
    return $result;
 }
}

Además nuestra clase de acceso a los datos de usuario deberá también tener un método update:

function updateUser($idUser,$query) {
     /* primero actualizamos la base de datos y si es correcto lo metemos en memcached*/
     if (db_execute($query)) {
         // actualización con éxito : cogemos los datos para almacenarlos en la caché
         $result = db_select("SELECT * FROM users WHERE userid = $idUser");
         // almacenamos en la caché para la próxima 
         $this->mem->set(json_encode($this->claveMC.$this->idUser, $result));
     }
 }

En lugar de pasarle la query al update podríamos haber pasado un array con todos los datos y con él componer la query de update, para el caso es lo mismo.

Votos totales: 194