2010-04-08 4 views
6

Ich verwende PDO für die Verbindung mit der Datenbank in einem System, in dem ich Memcached implementieren möchte.Wie kann ich ein Cache-System mit PDO und Memcached entwerfen?

Ich weiß nicht, welche Schlüssel für die Zwischenspeicherung der Ergebnisse verwenden, weil ich die Zeichenfolge der endgültigen Abfrage mit PDO nicht erhalten kann (weil die vorbereiteten Anweisungen).

Eine gute Idee, um das zu lösen?

Vielen Dank im Voraus. Hier

+0

Findest du etwas, das dir hilft? –

Antwort

7

Wenn Sie vorhaben, nur Abfrageergebnisse zwischenspeichern direkt basierend auf Abfrage-String, Mysql Query Cache tut dies bereits für Sie. Erfinde das Rad nicht neu. Der einzige potentielle Unterschied ist, dass Mysqls Abfrage-Cache aggressiv ungültig gemacht wird, so dass veraltete (veraltete, falsche) Daten niemals zurückgegeben werden; Je nachdem, wie Sie mit der Ungültigmachung umgehen, kann Ihre Strategie die Datenbankbelastung weiter reduzieren, jedoch auf Kosten der veralteten, veralteten Daten regelmäßig.

Außerdem können Sie Ihre verschiedenen Cacheschlüssel nicht selektiv ablaufen lassen, wenn Aktualisierungen durchgeführt werden (wie würden Sie wissen, welche Abfragezeichenfolgen abgelaufen sein sollten, wenn eine Einfügung/Aktualisierung ausgeführt wird?); Daher müssen Sie nur eine kurze Ablaufzeit festlegen (wahrscheinlich in Sekunden), um die Zeit zu verkürzen, in der Sie veraltete Daten bereitstellen. Dies wird wahrscheinlich eine niedrige Cache-Trefferrate bedeuten. Am Ende ist die Caching-Strategie, die Sie beschreiben, einfach zu implementieren, aber es ist nicht sehr effektiv.

Stellen Sie sicher, dass Sie die "Generic Design Approaches" section der memecached FAQ lesen. Eine gute Caching-Strategie löscht/ersetzt zwischengespeicherte Daten sofort, wenn Aktualisierungen durchgeführt werden. Auf diese Weise können Sie Daten für Stunden/Tage/Wochen zwischenspeichern und gleichzeitig den Benutzern nie veraltete Daten bereitstellen.

+1

Sie haben Recht. Meine Frage ergibt keinen Sinn. Danke! – Castro

1

ist interessant Tutorial es könnte hilfreich sein - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

Ich denke, Sie den Prozess durch die Implementierung einer Funktion wie folgt automatisieren:

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

ja, ich dachte in etwas transparenter (ich möchte nicht jede Abfrage nennen), ich denke, ich werde die Abfrage mit dem Rest der Params verkettet Hash. was denkst du? – Castro

+5

Das Erstellen eines Cacheschlüssels aus $ sql + params ist ziemlich einfach - füge einfach diese Zeile an die Spitze der Ivo-Funktion und entferne das $ name-Argument: '$ name = 'querycache-'. md5 (serialize (array ($ sql, $ params))); ' –