2012-04-13 15 views
17

Sto cercando di capire (e probabilmente distribuire) memcached nel nostro ambiente.Come funziona memcache con MySQL?

Abbiamo 4 server Web su loadbalancer che eseguono una grande app web sviluppata in PHP. Stiamo già utilizzando APC. Voglio vedere come funziona memcached? Almeno, potrebbe essere che non capisco come funziona la cache.

Abbiamo alcune query dinamiche complesse che combinano diverse tabelle per estrarre i dati. Ogni volta, i dati verranno da diversi database dei clienti e i dati continueranno a cambiare. Da quanto ho capito, se alcuni dati sono archiviati nella cache e se la richiesta è la stessa la volta successiva, vengono restituiti gli stessi dati. (Oppure potrei sbagliarmi completamente qui).

In che modo tutto questo memcache (o per quello, qualsiasi roba di memorizzazione nella cache funziona)?

risposta

22

La cache, in generale, è un motore di memorizzazione di chiavi/valore molto veloce in cui è possibile memorizzare valori (generalmente serializzati) con una chiave predefinita, in modo da poter recuperare i valori memorizzati con la stessa chiave.

In relazione a MySQL, si scriverebbe il codice dell'applicazione in modo tale da verificare la presenza di dati nella cache, prima di inviare una richiesta al database. Se viene trovata una corrispondenza (esiste una chiave corrispondente), si avrà quindi accesso ai dati associati alla chiave. L'obiettivo è di non inviare una richiesta al database più costoso se può essere evitato.

Un esempio (dimostrativo solo):

$cache = new Memcached(); 

$cache->addServer('servername', 11211); 

$myCacheKey = 'my_cache_key'; 

$row = $cache->get($myCacheKey); 

if (!$row) { 

    // Issue painful query to mysql 
    $sql = "SELECT * FROM table WHERE id = :id"; 

    $dbo->prepare($sql); 
    $stmt->bindValue(':id', $someId, PDO::PARAM_INT); 

    $row = $stmt->fetch(PDO::FETCH_OBJ); 

    $cache->set($myCacheKey, serialize($row)); 
} 

// Now I have access to $row, where I can do what I need to 
// And for subsequent calls, the data will be pulled from cache and skip 
// the query altogether 
var_dump(unserialize($row)); 

Scopri documenti PHP su memcached per ulteriori informazioni, ci sono alcuni buoni esempi e commenti.

+0

Possiamo memorizzare variabili regolari da memcached? È nella pratica? –

+0

Per essere più specifici, ho un sacco di variabili costanti che vengono utilizzate in tutta l'app. Posso memorizzarli nella cache? –

+1

Puoi darmi un esempio di una variabile 'costante'? Per definizione, le costanti non sono dinamiche. –

1

Esistono diversi esempi su come funziona memcache. Here è uno dei collegamenti.

In secondo luogo, Memcache può funzionare con o senza MySQL.

Memorizza nella cache gli oggetti che sono in PHP, ora se proviene da MySQL o da qualsiasi altra parte, se è un oggetto PHP, può essere memorizzato in MemCache.

APC offre alcune funzionalità in più rispetto a Memcache. Oltre alla memorizzazione/memorizzazione nella cache di oggetti PHP, memorizza nella cache anche i codici opzionali PHP-eseguibili-macchina-leggibili, in modo che i file PHP non passino attraverso i processi di caricamento in memoria-> Essere in Comiled, piuttosto, esegue direttamente l'opcode già compilato dalla memoria.

+0

grazie !. ma immagino che la mia domanda non sia chiara.Consente di dire che questo è l'interrogazione: ' ** SELECT Nome, età da persona ** ' Codice delle e questo è il risultato: 'Codice delle Krish, 45 Josh, 25 Kevin, 60 ' codice ' la prossima volta, quando chiamo la stessa query, potrebbe tornare: ' Codice delle Joe, 45 Jay, 25 Chris, 60 'Codice delle –

+0

Ci scusiamo per l'ripubblicare: grazie !. ma immagino che la mia domanda non sia chiara. Consente di dire che questo è l'interrogazione: ' ** SELECT Nome, età da persona ** ' e questo è il risultato: ' Krish, 45 Josh, 25 Kevin, 60 ' La prossima volta, quando chiamo la stessa query, potrebbe tornare: ' Joe, 45 Jay, 25 Chris, 60 ' Come funziona caching qui? Come viene memorizzata la query nella cache? –

+2

Questa query non può ricevere risposta dalla cache. La memorizzazione nella cache presuppone che i dati non siano stati modificati rispetto alla richiesta precedente. Tutto ciò che fa, in realtà, è memorizzare temporaneamente alcuni dati in memoria per un rapido accesso. Guardala in questo modo: se hai appena fatto una richiesta per vedere tutte le persone nel tuo database il cui nome inizia con "Kev" e che hanno più di 25. La prima volta che la tua app ha ricevuto questa richiesta, ha dovuto chiedere a MySQL di prendi i risultati Se poi comunichi alla tua app di memorizzare nella cache questi risultati, la prossima volta che qualcuno esegue quella * esatta * stessa query, può semplicemente rispondere dalla cache. Questo non funziona se i dati sono diversi. – Daan

1

Se i dati continuano a cambiare (tra le richieste), il caching è inutile, perché i dati saranno obsoleti. Ma la maggior parte delle volte (scommetto anche nella tua cache) più richieste al database danno lo stesso set di dati, nel qual caso una cache (in memoria) è molto utile.

P.S: Ho fatto una rapida ricerca su google e ho trovato questo video su memcached che ha una qualità piuttosto buona =>http://www.bestechvideos.com/2009/03/21/railslab-scaling-rails-episode-8-memcached. L'unico problema potrebbe essere che parla di Ruby On Rails (che anch'io non uso molto, ma è molto facile da capire). Spero che ti possa aiutare a cogliere il concetto un po 'meglio.

+0

Grazie mille!Questo video è utile! –