2013-02-10 2 views
0

Je travaille pour Memcache depuis une semaine ou deux, j'ai réussi à trouver comment régler les touches/supprimer les touches. C'est bien, mais je suis toujours en train d'essayer de faire la même chose pour une boucle de résultats. Par exemple, je vais avoir une boucle de messages, à partir de la logique, la fonction va vérifier si Memcache est activé, sinon elle va collecter les résultats et créer la clé. Ma question est la suivante: Si j'ai défini les données en boucle dans une touche Set et que j'affiche la touche de réglage (la plus récente en premier) Ensuite, que se passe-t-il lorsqu'un nouveau message est inséré? Je comprends que je peux définir une limite de temps sur la touche set, mais que le contenu sera/pourrait être ajouté chaque fois qu'il semble que le réglage d'une limite pourrait encore afficher les anciens messages. Donc, ma question est de savoir comment je serais en mesure de mettre à jour la clé de réglage. La seule façon de penser à une solution possible est lorsqu'un utilisateur insère un nouveau message, cela supprime la clé, et lorsque tous les messages sont à nouveau affichés, c'est quand la clé est à nouveau définie. Mais cela semble plutôt contre-productif, comme s'il y avait des dizaines d'utilisateurs soumettant des messages, alors tous les messages seront remis encore et encore (ne semble pas vraiment bénéfique)Memcache - Comment éviter les reconstructions fréquentes du cache?

J'espère que cela a du sens, de l'aide ou des conseils serait apprécié.

Répondre

0

Oui, le scénario que vous avez spécifié se produira si vous supprimez la clé lorsqu'il y a un nouveau message. Pour échapper à cela, vous pouvez utiliser a) l'expiration de memcache ou b) maintenir son propre système de travail contrôlant le seuil de recréation du cache.

Expiration de Memcache

PHP a deux plugins Memecache PECL dire Memcache et Memcached. Memcached (notez le suffixe d) prend en charge une méthode appelée touch qui nous permet de définir une nouvelle heure d'expiration pour un élément existant. En supposant que vous définissez votre cache pendant 2 heures, lorsqu'un nouveau message apparaît, nous pouvons définir l'expiration à 10 minutes en utilisant touch. Ainsi, s'il y a de nouveaux messages dans les 10 prochaines minutes, le cache ne sera reconstruit qu'une seule fois. Cette technique est connue sous le nom de "debouncing" en termes techniques.

Certains code:

$_memcached = new Memcached; 
if(!$_memcached->addServer('localhost',11211)) 
{ 
    $_isConnected = FALSE; 
} 
else 
{ 
    $_isConnected = TRUE; 
} 

$_memcached->touch($key, $expiry); 

$_memcaced->add($key, $value, $expiry); 

S'il vous plaît noter: c'est par exemple que, s'il vous plaît créer une classe singleton et utiliser.

Si vous devez utiliser l'ancien plugin Memcache, vous pouvez uniquement répliquer le comportement touch en utilisant une combinaison de (atomique) get et set.

système d'emploi

Si vous avez un système d'emploi alors soumettre un emploi à chaque fois qu'un nouveau poste apparaît qui sera exécutée par un agrégateur de travail pour contrôler la fréquence du cache reconstitue.

Aller avec Memecached semble être la meilleure approche.

+0

Merci Birla c'est utile. J'ai installé Memcached, qui semble être le meilleur des deux (bien que la grande majorité des articles que j'ai lus soient principalement destinés à Memcache) Serais-tu capable de donner un exemple grossier d'utilisation de la méthode tactile? Je vais essayer de mettre à jour ma question avec du code pour illustrer comment je peux résoudre ce problème. En ce qui concerne la méthode tactile. – HireLee

+0

@LeeMarshall J'ai mis à jour la réponse avec du code.Fondamentalement, vous devez appeler 'touch' sur la même touche que lorsque vous appelez' add' pour stocker le groupe des derniers messages. – Birla

+0

Je vois ce que vous voulez dire, ai-je raison de dire que la méthode tactile ne permettra pas une autre reconstruction jusqu'à ce que l'expiration de la méthode tactile se soit produite? Est-ce correct? Prévenir beaucoup de reconstructions dans une période donnée (Dans l'exemple ci-dessus qui serait 10mins) – HireLee

Questions connexes