2010-04-08 6 views
6

Estoy usando PDO para conectarme a la base de datos en un sistema donde quiero implementar memcached.¿Cómo puedo diseñar un sistema de caché usando PDO y memcached?

No sé qué teclas usar para almacenar en caché los resultados porque no puedo obtener la cadena de la consulta final con PDO (porque las declaraciones preparadas).

¿Alguna buena idea para resolver esto?

Gracias de antemano.

+0

¿Encuentras algo que te ayude? –

Respuesta

7

Si sólo vamos a almacenar en caché los resultados de la consulta directamente basado en la cadena de consulta, el caché de consultas de Mysql ya lo hace por usted. No reinventar la rueda. La única diferencia de potencial es que la caché de consultas de Mysql está invalidada de manera agresiva, por lo que nunca se devuelven los datos obsoletos (desactualizados); Dependiendo de cómo maneje la invalidación, su estrategia puede reducir aún más la carga de la base de datos, pero a costa de presentar datos caducados y desactualizados de forma regular.

Además, realmente no podrá caducar selectivamente sus diversas claves de caché cuando se produzcan las actualizaciones (¿cómo sabría qué cadenas de consulta deberían expirar cuando se ejecuta una inserción/actualización?); como resultado, solo tendrá que establecer un tiempo de caducidad corto (probablemente en segundos), para minimizar la cantidad de tiempo que está sirviendo datos obsoletos. Esto probablemente significará una baja tasa de aciertos de caché. Al final, la estrategia de caché que describes es simple de implementar, pero no es muy efectiva.

Asegúrese de leer el "Generic Design Approaches" section de las preguntas frecuentes memecached. Una buena estrategia de almacenamiento en caché elimina/reemplaza los datos almacenados en caché inmediatamente cuando se producen las actualizaciones; esto le permite almacenar datos en caché durante horas/días/semanas, y al mismo tiempo nunca entregar datos desactualizados a los usuarios.

+1

Tiene razón. Mi pregunta no tiene sentido. Gracias! – Castro

1

Aquí es interesante tutorial que podría ser útil - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

supongo que se puede automatizar el proceso mediante la aplicación de una función como esta:

function query($name, $sql, $params, $db, $cache) { 
    $result = $this->cache->get($name); 

    if (!$result) { 
     $stmt = $db->prepare($sql); 
     $exec = $stmt->execute($params); 
     $result = $stmt->fetch(PDO::FETCH_ASSOC); 

     $cache->add($name, $result); 
    } 

    return $result; 
} 
+0

sí, estaba pensando en algo más transparente (no quiero nombrar todas las consultas), creo que voy a hash la consulta concatenada con el resto de los parámetros. ¿qué piensas? – Castro

+5

Crear una clave de caché a partir de $ sql + params es bastante simple: simplemente agregue esta línea a la parte superior de la función de Ivo y elimine el argumento $ name: '$ name = 'querycache-'. md5 (serialize (array ($ sql, $ params))); ' –

Cuestiones relacionadas