2009-06-26 10 views
4

J'ai une application qui reçoit des messages de périphériques toutes les quelques minutes. J'ai aussi des clients qui demandent les 10 derniers messages pour un appareil particulier.Devrais-je mettre les données en cache de manière préventive?

Je souffre avec une certaine saturation de base de données et je souhaite mettre en cache cette liste par appareil. La prémisse de base est que lorsqu'un message est reçu du périphérique, le processeur qui reçoit les messages invalidera le cache pour ce périphérique.

Ma question est de savoir si je devrais juste invalider le cache et le faire ensuite reconstruire lorsque le client suivant se connecte, ou devrais-je avoir le processeur de l'appareil reconstruire le cache de manière préventive. Le processeur de l'appareil peut récupérer la mémoire cache actuelle, désactiver la dernière entrée, ajouter la nouvelle entrée et mettre en cache le nouveau résultat. J'apprécie que cela puisse être une question de réponse, mais j'apprécierais d'entendre les propres expériences des gens dans ce domaine.

Répondre

1

Je pense que vous décrivez un mécanisme de "pré-extraction", juste pour vous aider à mettre un nom dessus. :)

Je n'ai pas beaucoup d'expérience dans ce domaine particulier, mais si vous croyez que vous pouvez pré-extraire des données et prédire de façon fiable que c'est ce que le client veut, et vous obtenez une amélioration de performance mesurable et souhaitable à cause de cela, alors allez-y et donnez-lui un tourbillon.

N'oubliez pas de garder à l'esprit toute la pilosité de la mise en cache. Comment est-il invalidé lorsque les données sous-jacentes changent, etc. Bonne chance!

+0

Heureusement, il n'y a qu'un seul événement qui invalide le cache, la réception d'un nouveau message. Ce "devrait" être un changement relativement trivial. –

0

Je vous entends, mais ça dépend vraiment. Sur beaucoup, beaucoup de variables. Si c'était moi, j'aurais probablement juste invalider le cache et laisser le prochain client le reconstruire puisque cela semble un peu plus simple, mais je ne vois pas comment vous pourriez déterminer quel moyen fonctionne mieux sans les essayer tous les deux. Heureusement, vous pouvez trouver un moyen de simuler de façon réaliste une lourde charge client afin de ne pas vous tromper avec le serveur live.

1

Je ne pense pas que vous puissiez répondre à cette question tant que vous n'avez pas quantifié le nombre moyen de fois qu'un client récupère des messages pour un périphérique donné. Si un périphérique donné est uniquement interrogé pour les messages une fois dans une lune bleue, il est bon de purger le cache de messages sur chaque requête client. Cependant, si la file d'attente de messages d'un périphérique donné est interrogée plusieurs fois, une mise en cache préemptive sur la synchronisation de périphérique est probablement la meilleure option; étant donné que les synchronisations de l'appareil sont moins fréquentes que les demandes du client.

Votre meilleur but pourrait être d'écrire un système qui met en cache de manière adaptative en fonction de la charge. Si la file d'attente de messages d'un périphérique donné est souvent interrogée, elle rafraîchit le cache lors de la synchronisation du périphérique. Si une file d'attente de messages de périphérique est rarement interrogée, vous actualisez le cache sur la requête du client.

Questions connexes