2010-06-20 5 views
1

Je travaille sur un site Web occupé. Parfois, il y a beaucoup plus de trafic que de jours avarage. Le contenu est mis en cache mais comme le propriétaire du site veut voir les affichages en temps réel, il doit faire au moins une requête à MySQL par affichage, ce qui est devenu un problème de performance sous une charge importante. Tout ce que je peux penser est de créer une table différente pour les vues et mettre à jour la table d'origine régulièrement avec un travail cron. Je suis sûr que cela réduira le temps de mise à jour mais je ne suis pas sûr que ce soit le meilleur moyen.Affichage en temps réel du contenu mis en cache

Répondre

0

Eh bien, comme pour votre question, il y a trois options:

  1. Ne pas mettre en cache ce morceau particulier de l'information. Mais d'après votre description, il semble que vous le fassiez déjà et que cela ne marche pas.

  2. Utilisez un cache en écriture. Chaque fois que vous "ajoutez" ou "supprimez" un post, générez également les données mises en cache pour cet élément. Cela peut être difficile selon le fonctionnement de votre système de cache, mais c'est une option.

  3. Invalide le cache en écriture. Chaque fois que vous souhaitez ajouter ou supprimer un message, supprimez les données mises en cache pour ces publications. De cette façon, lors de la prochaine requête pour ceux-ci du cache, le cache sera rempli. Cela peut être ou ne pas être facile, car il peut ne pas être trivial de détecter les éléments mis en cache référençant un nœud db (il peut être nécessaire d'ajouter plus d'informations, ou des objets de méta-cache pour garder une trace de ces données).

Maintenant, avec cela dit, je trouve un peu étrange qu'une requête devienne un problème de performance. Ce qui est plus probable, c'est que la requête en question doit être optimisée, ou votre serveur MySQL doit être optimisé. Je vois régulièrement plus de 5k requêtes par seconde sur certains de mes serveurs de production, et je n'ai aucun problème avec load. C'est parce que ces requêtes sont très efficaces, et j'ai Query Caching activé dans MySQL (c'est plus efficace que vous ne le pensez) ...

+0

Merci pour votre réponse. La requête est très simple. Il met à jour la table des messages pour augmenter les affichages des messages: "UPDATE posts SET vues = views + 1 WHERE id = '$ postid' Pour la dernière partie de votre réponse, j'utilise aussi la mise en cache des requêtes Le problème ne concerne pas cette seule requête. Le serveur est très occupé et j'essaie de réduire la charge de MySQL dans la mesure du possible.Cette requête est l'une des requêtes les plus utilisées.L'optimiser pourrait donc être très utile Merci encore – redrain

+0

Ohhh ... C'est une écriture Cette requête est très différente de l'implication que j'ai vue Quel moteur utilise la table (InnoDB ou MyISAM)? – ircmaxell