2009-08-20 5 views
13

Je construis un magasin en ligne avec de nombreux départements et catégories. Ils sont stockés dans notre base de données et consultés souvent.Asp.net - Caching vs variable statique pour stocker un dictionnaire

Nous utilisons la réécriture d'URL de sorte que presque toutes les demandes dans le magasin génèrent une recherche. Nous devons également parcourir régulièrement les données pour générer des menus pour le magasin principal et les pages du département.

Cette information ne changera pas souvent, donc je pense que je devrais charger la base de données dans un dictionnaire pour accélérer la récupération de l'information. Je sais que la pratique standard consiste à charger des données dans le cache d'application, mais je suppose qu'il y a un certain niveau de sérialisation qui se produit pendant la mise en cache, et pour une grande structure de données, je pense que la surcharge serait significative.

Mon impulsion sur ceci est de mettre le dictionnaire dans une variable statique dans l'une des classes liées. J'aimerais toutefois avoir un apport d'information à ce sujet. Ai-je raison de penser que cette méthode serait plus rapide? Est-ce une pratique horrible? Y a-t-il un meilleur moyen de me manquer?

Je n'arrive pas à trouver beaucoup d'informations à ce sujet et j'apprécierais vraiment toute information que vous pouvez partager. Merci!

Répondre

19

Les collections Application et Cache ne sérialisent pas les objets que vous leur transmettez, elles stockent la référence réelle. Récupérer un objet du cache ne sera pas une opération coûteuse, peu importe la taille de l'objet. Toujours coller avec les objets Cache sauf si vous avez une très bonne raison de ne pas, c'est juste une bonne pratique. La seule autre chose qui mérite d'être mentionnée est de vous assurer de penser à l'accès multithread à cette collection. Vous allez vous retrouver avec de sérieux problèmes très rapidement si vous ne verrouillez pas correctement

+0

Merci beaucoup- C'est précisément ce que j'avais besoin de savoir. –

+0

heureux d'aider :) – LorenVS

+4

Assurez-vous simplement que, si vous utilisez l'application ou le cache, ils sont par machine. Si vous avez plusieurs machines (par exemple, ferme Web) alors vous êtes en difficulté .. et vous devrez utiliser une solution de mise en cache évolutive, comme Microsoft Velocity ou MemCacheD (le 'D' est pour Daemon). –

3

memcached est votre ami! (mais cela pourrait être exagéré si vous n'élargissez pas)

Une idée de la taille de votre dictionnaire dans le cache d'application? Je serais tenté de recommander cela comme une bonne première option.

+0

Je regarde quelques dizaines de départements et quelques centaines de catégories ainsi que des informations associées ... si bien que la taille ne devrait pas être trop mauvaise. Ma seule hésitation à utiliser la mise en cache au niveau de la base de données est qu'à chaque appel, il me reste à convertir les objets renvoyés par la base de données en leurs types associés. Il y a aussi des données associées comme l'url que j'espérais pré-calculer. Étant donné que j'aurai souvent besoin de longues listes de ces éléments, je pensais que je devrais mettre en cache plus haut sur la ligne. C'est toujours une bonne option et j'apprécie vraiment l'info! –

4

Eh bien, je ne pense pas qu'il faille autant de travail pour réécrire le code pour utiliser un champ statique au lieu du cache de l'application s'il y a besoin faire cela. J'utiliserais personnellement le cache d'abord. Il n'y a pas besoin d'optimisation prématurée, avez-vous mesuré la performance? Il peut se comporter correctement avec l'objet de cache de l'application. Peut-être que cela fonctionne même bien avec les requêtes db? :)

Donc, ma réponse est - utiliser le cache et voir comment cela fonctionne.

Questions connexes