7
votes

Caching des données utilisateur pour éviter les voyages de bases de données excédentaires

Après avoir créé une preuve de concept pour un site ASP.NET MVC et en veillant à ce que la séparation appropriée des préoccupations était en place, j'ai remarqué que je faisais beaucoup de données de base de données redondantes coûteuses appelle à des informations sur l'utilisateur actuel.

Être historiquement d'une personne de bureau et de services, ma première pensée était de cacher le DB résulte de certains statique s. Cela ne cherchait pas à voir que cela persiste les données actuelles de l'utilisateur sur l'ensemble de l'appdomain pour tous les utilisateurs.

Ensuite, je pensais utiliser httpcontext.current . Toutefois, si vous mettez des trucs ici lorsqu'un utilisateur est déconnecté, alors quand ils se connectent dans vos données en cache seront obsolètes. Je pourrais mettre à jour cela à chaque fois que vous connectez / déconnecté se produit, mais je ne peux pas dire si cela ressent bien. En l'absence d'autres idées, c'est là que je suis penché.

Qu'est-ce qu'un moyen léger de cache avec précision les détails des utilisateurs et d'éviter de faire des tonnes d'appels de base de données?


1 commentaires

Quel type de données avez-vous besoin de stocker? Si ce n'est que quelques propriétés simples, c'est-à-dire des chaînes, des entiers, vous pourriez alors stocker dans le cookie des formes.


3 Réponses :


3
votes

Qu'est-ce que vous cherchez est System.Web.caching.cache

http://msdn.microsoft.com /en-us/library/system.web.caching.cache.aspx


4 commentaires

Pour citer MSDN "Une instance de cette classe est créée par domaine d'application" qui n'est pas ce que l'OP souhaite.


J'utilise httpcontext.current.current.cache pour stocker iprincipal avec Formulosauthentication. La session signifie un autre cookie et des problèmes supplémentaires.


Je suis bien conscient que une instance est créée par AppDomain mais ce qui ne va pas avec l'ajout et la récupération du cache avec une clé unique pour l'utilisateur. par exemple. Utilisateur-1 où 1 est l'identifiant de l'utilisateur? Il résout toujours le problème imo.


Vous pouvez également utiliser httpcontext.current.items qui est par utilisateur, mais aussi par demande qui pourrait ne pas être ce que vous voulez.



5
votes

Si les informations que vous souhaitez cache sont par utilisateur et seulement lorsqu'elles sont actives, la session est le bon endroit.
http://msdn.microsoft.com/en-us /Library/system.web.sessstate.htttpossessionState.aspx


4 commentaires

Voici un autre excellent article travaillant au-dessus de la session: Stackoverflow.com/questions/343899


La session est vraiment par session de navigateur. Vous pouvez vous connecter en tant qu'utilisateur différent à l'aide du même navigateur, et l'état de session renvoyé sera le même que pour l'utilisateur précédent.


@Steve Si tel est le cas, l'application ne manipule pas correctement la connexion.


Je sais que c'est vieux mais je voulais faire en sorte que les gens pensent aussi. État de session, par défaut, est limité au serveur Web. L'application est activée. Si vous équilibrez et souhaitez utiliser l'état de la session, vous devez utiliser une base de données SQL Server pour stocker vos sessions, un serveur d'état ASP.NET ou un serveur personnalisé. Voir la section Remarques Section ici



3
votes

ASP.NET Session-State-State-State Gestion est bon pour certaines situations, mais lorsque la charge lourde est mise, elle a tendance à créer des goulots d'étranglement dans les performances ASP.NET. En savoir plus à ce sujet ici:

http://msdn.microsoft.com/en-us/magazine /dd942840.aspx

http://esj.com/articles /2009/03/17/Optimize-Scalabilité-asp-net.aspx

La solution pour éviter les goulots d'étranglement est l'utilisation de la mise en cache distribuée. Il existe de nombreuses solutions de mise en cache distribuées gratuites sur le marché comme Memcached ou Ncache Express.

Ne sais pas beaucoup sur Memcached mais j'ai utilisé Ncache Express par ALACHISOFT, il vous permet d'utiliser ASP.NET Caching sans nécessiter de changement de code.


0 commentaires