Comment fonctionne memcache avec MySQL?

j'essaie de comprendre (et probablement de déployer) memcached dans notre env.

nous avons 4 serveurs web sur loadbalancer qui utilisent une grosse application web développée en PHP. Nous utilisons déjà APC. Je veux voir comment fonctionne memcached? Au moins, peut-être que je ne comprends pas comment fonctionne la mise en cache.

nous avons quelques requêtes dynamiques complexes qui combinent plusieurs tables pour tirer des données. Chaque fois, les données vont provenir de différentes bases de données de clients et les données ne cessent d'évoluer. De mon comprendre, si certaines données sont stockées dans le cache, et si la demande est la même la prochaine fois, les mêmes données sont retournées. (Ou j'ai peut-être complètement faux).

Comment fonctionne toute cette memcache (ou d'ailleurs, toute sorte de cache)?

21
demandé sur Kevin Rave 2012-04-13 08:50:19

3 réponses

le Cache, en général, est un moteur de stockage de clés/valeurs très rapide où vous pouvez stocker des valeurs (généralement sérialisées) par une clé prédéterminée, de sorte que vous pouvez récupérer les valeurs stockées par la même clé.

en relation avec MySQL, vous écririez votre code d'application de manière à vérifier la présence de données dans le cache, avant d'envoyer une requête à la base de données. Si une correspondance était trouvée (la clé de correspondance existe), vous auriez alors accès aux données associées à la clé. Le le but est de ne pas émettre une demande à la base de données la plus coûteuse si elle peut être évitée.

Un exemple (démonstratif):

$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));

consultez les docs PHP sur memcached pour plus d'information, il y a quelques bons exemples et commentaires.

24
répondu Mike Purcell 2012-04-13 05:09:10

il existe plusieurs exemples de fonctionnement de memcache. Ici est l'un des liens.

Deuxièmement, Memcache peut fonctionner avec ou sans MySQL.

il cache vos objets qui sont en PHP, maintenant qu'il vient de MySQL, ou n'importe où ailleurs, si C'est un objet PHP, il peut être stocké dans MemCache.

APC vous donne plus de fonctionnalités que Memcache. En plus de stocker/cacher des objets PHP, il cache aussi PHP-executable-machine-readable-opcodes so que vos fichiers PHP ne passent pas par les processus de chargement en mémoire-> étant Comiled, il exécute directement le code op déjà compilé à partir de la mémoire.

1
répondu linuxeasy 2012-04-13 04:55:01

si vos données continuent à changer(entre les requêtes) alors la mise en cache est futile, parce que ces données vont être périmées. Mais la plupart du temps(je parie que même dans votre cache), plusieurs requêtes à la base de données aboutissent au même jeu de données, auquel cas un cache (en mémoire) est très utile.

P. S: j'ai fait une recherche rapide sur google et j'ai trouvé cette vidéo sur memcached qui a plutôt bonne qualité => http://www.bestechvideos.com/2009/03/21/railslab-scaling-rails-episode-8-memcached