2010-12-09 5 views
0

J'ai une application Facebook avec 250K DAU. J'utilise Memcached pour mettre en cache les fichiers et MySql sélectionne car sans cela mon serveur devient fou.Memcached problème étrange!

J'ai mis en place le code comme ceci:

$memcache = new Memcache; 
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect"); 

// POUR LES FICHIERS

$doc = $memcache->get('mem_index_html'); 

if ($doc == null) 
{ 
    $doc = new Document(HTML.'index.html'); 
    $memcache->set('mem_index_html', $doc, 0, 86400); 
} 

// POUR SQL

$sql=sprintf('count(qtn_id) FROM tb_questions where qtn_lang="EN")); 
$total_pages = $memcache->get($sql); 

if ($total_pages == null) 
{  
    $query_id = DB::query($sql);   
    list($total_pages) = DB::nextRow($query_id); 
    DB::free($query_id); 
    $memcache->set($sql, $total_pages, 0, 86400); 
} 

Le problème est que, après un certain temps - habituellement 24 heures, les erreurs commencent à apparaître. Aucun journal n'est créé mais je reçois un délai d'expiration si j'essaie de recharger la page. Je suppose qu'il y a beaucoup de trafic dans ce moment, le Memcached ne fonctionne pas correctement et tout ralentit. Ma solution temporaire est de vider le memcache - $memcache->flush(), mais ce n'est pas une bonne solution.

Est-ce que je fais quelque chose de mal? Y at-il quelque chose à optimiser ou je ne sais pas. J'ai trouvé la recherche par le biais de ce Web http://code.google.com/p/memcached/wiki/TutorialCachingStory sur la fabrication de plus d'un serveurs Memecached. Est-ce la meilleure solution?

Merci pour vos réponses.

Darko

+0

temporel ne signifie pas temporaire. Cela signifie avoir à faire avec le temps. Même racine, significations différentes. – DampeS8N

Répondre

1

Le quatrième paramètre dans la commande memcache- $> réglé représente le délai d'expiration. Une fois ce dépassement, l'objet stocké ne sera plus disponible. Étant donné que vous l'avez défini sur 24 heures, elles ne seront plus disponibles après cette période, sauf si vous les avez mises à jour.

Si le paramètre d'expiration est défini sur 0, l'élément n'expirera jamais, mais il peut toujours être supprimé si memcached est rempli et doit libérer de l'espace.

Si la valeur est inférieure à 30 jours (30 * 24 * 3600 = 2592000), la valeur fournie est traitée comme un décalage par rapport à l'heure actuelle.

Si la valeur est supérieure à cela, elle sera interprétée en temps absolu.

+0

Salut Chris, merci pour votre réponse. La chose est que j'ai essayé les deux façons: avec le numéro 86400 et 0. Mais dans les deux cas, après 24 heures, quelque chose va mal et je dois vider le memcached pour commencer à travailler. Ma question maintenant sont: 1) Comment libérer la mémoire memcached sans redémarrer le serveur? 2) Memcached est-il bon pour les fichiers (php/html) ou seulement pour MySql? 3) Je vois beaucoup d'exemples Memcached utilisant md5. Devrais-je l'utiliser? Merci – darko4spain

+0

Memcached peut être utilisé pour stocker n'importe quoi (qui ne dépasse pas 1 Mo) car il le traite comme des données et n'interprète pas ce que vous stockez, donc stocker du HTML n'est pas un problème. Il est étrange que 0 n'a pas fonctionné pour vous. Se pourrait-il qu'il ait manqué d'espace et ait commencé à expulser des données? Essayez avec une grande valeur pour l'expiration (plusieurs jours) et vérifiez également les statistiques en utilisant la commande 'stats' pour voir si des éléments ont été expulsés. – Chris