2010-04-08 5 views
6

J'utilise PDO pour se connecter à la base de données dans un système où je veux implémenter memcached.Comment puis-je concevoir un système de cache en utilisant PDO et memcached?

Je ne sais pas quelles clés utiliser pour mettre en cache les résultats parce que je ne peux pas obtenir la chaîne de la requête finale avec PDO (parce que les instructions préparées).

Une bonne idée pour résoudre ce problème?

Merci d'avance.

+0

Vous trouvez quelque chose qui peut vous être utile? –

Répondre

7

Si vous allez juste pour mettre en cache les résultats de la requête directement basé sur la chaîne de requête, le cache de requête Mysql le fait déjà pour vous. Ne réinventez pas la roue. La seule différence potentielle est que le cache de requête de Mysql est agressivement invalidé, de sorte que les données périmées (périmées, incorrectes) ne sont jamais retournées; Selon la façon dont vous gérez l'invalidation, votre stratégie peut réduire davantage la charge de la base de données, mais au prix de la fourniture régulière de données périmées et périmées. En outre, vous ne pourrez pas expirer de manière sélective vos différentes clés de cache lorsque des mises à jour se produisent (comment savoir quelles chaînes de requête doivent expirer lorsqu'une insertion/mise à jour est en cours?); par conséquent, vous devrez juste définir une courte durée d'expiration (probablement en quelques secondes), afin de minimiser la durée pendant laquelle vous fournissez des données périmées. Cela signifiera probablement un faible taux de succès du cache. En fin de compte, la stratégie de mise en cache que vous décrivez est simple à mettre en œuvre, mais elle n'est pas très efficace.

Assurez-vous de lire le "Generic Design Approaches" section de la FAQ mémorisée. Une stratégie de mise en cache efficace supprime/remplace immédiatement les données mises en cache lorsque des mises à jour se produisent. Cela vous permet de mettre en cache des données pendant des heures/jours/semaines et de ne jamais fournir de données obsolètes aux utilisateurs.

+1

Vous avez raison. Ma question n'a aucun sens. Merci! – Castro

1

est ici tutoriel intéressant, il pourrait être utile - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

Je suppose que vous pouvez automatiser le processus en mettant en place une fonction comme celle-ci:

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

oui, je pensais à quelque chose de plus transparent (je ne veux pas nommer chaque requête), je pense que je vais hacher la requête concaténée avec le reste des paramètres. Qu'en penses-tu? – Castro

+5

Construire une clé de cache à partir de $ sql + params est assez simple - il suffit d'ajouter cette ligne au début de la fonction d'Ivo, et de supprimer l'argument $ name: '$ name = 'querycache-'. md5 (serialize (array ($ sql, $ params))); ' –

Questions connexes