Un cache de disque de système de fichiers persistant pour asp.net

Résumé de: https://www.codeproject.com/articles/12097/cache-management-in-asp-net
Utilisez différents termes pour expliquer le même concept, c'est-à-dire la gestion des données. Certaines personnes l'appellent la gestion de l'État et d'autres l'appellent la gestion du cache. J'aime le mot "cache". Mais conceptuellement, il n'y a pas de différence entre ces deux.
Discutons maintenant des différents aspects de la gestion du cache (ou de la gestion de l'État) dans ASP.NET.
Bien que la gestion du cache ne soit pas un problème dans les applications Windows, cela a toujours été un défi dans l'environnement Web. Étant donné que HTTP est un protocole sans état et qu'un serveur Web ne reconnaît pas les utilisateurs entre différentes demandes, il devient très important pour nous de reconnaître un utilisateur particulier entre les différentes demandes et de stocker également des données afin qu'elle puisse être réutilisée entre les différentes demandes. ASP.NET fournit de nombreuses fonctionnalités pour stocker des données à la fois dans les côtés du client (navigateur) et du serveur (serveur Web), mais parfois nous sommes confus avec quand utiliser quoi. Dans ASP.NET, nous rencontrons des fonctionnalités telles que les objets de session, d'application et de cache, mais il est important pour nous de comprendre la différence entre eux afin de les utiliser efficacement dans les applications Web.
Dans cet article, je vais aborder les différentes options de gestion de cache disponibles dans ASP.NET. Dans une application Web, nous devons parfois stocker des données du côté du serveur pour éviter un fonctionnement coûteux de récupération de données à partir des magasins de données et de la logique de mise en forme de données long pour améliorer les performances des applications ainsi que pour réutiliser les mêmes données dans les demandes ultérieures entre les utilisateurs, les applications et les machines. Donc, pour y parvenir, nous devons stocker (cache) les données du côté serveur.
La mise en cache nous aide à atteindre trois aspects importants de la QoS (qualité de service):
ASP.NET fournit un objet appelé objet d'application pour stocker des données accessibles à toutes les demandes d'utilisateur. La durée de vie de cet objet est liée à l'application et elle est recréée à chaque fois que l'application démarre. Contrairement à l'objet de session ASP.NET, cet objet est accessible à toutes les demandes de l'utilisateur. Étant donné que ce stockage est créé et maintenu dans un espace de domaine d'application, cela ne doit pas être utilisé pour le stockage de données dans un scénario de ferme Web. Cette option est très utile pour stocker des données comme les métadonnées de l'application (données de fichiers de configuration) qui peuvent être chargées à l'objet d'application pendant le démarrage de l'application et peuvent être utilisées pendant la durée de vie sans les recharger à chaque fois pour chaque demande d'utilisateur. Mais s'il est nécessaire d'invalider les données en cache chaque fois qu'il y a des modifications aux fichiers de configuration pendant l'exécution de l'application, cette option ne doit pas être utilisée car elle ne fournit aucune fonctionnalité pour expirer les données mis en cache. Ainsi, dans ce cas, d'autres options comme l'objet ASP.NET Cache doivent être utilisées, ce qui est expliqué ci-dessous.
ASP.NET fournit un objet de paire de valeurs de clé - l'objet Cache qui est disponible dans l'espace de noms System.web.caching. La portée de celui-ci est le domaine d'application et la durée de vie est liée à l'application. Contrairement à l'objet Session ASP.NET, cet objet est accessible à toutes les demandes d'utilisateur.
Bien que les objets d'application et de cache se ressemblent, la principale différence entre eux est les fonctionnalités ajoutées fournies par l'objet Cache comme les politiques d'expiration et les dépendances. Cela signifie que les données stockées dans l'objet Cache peuvent être expirées / supprimées sur la base d'une limite de temps prédéfinie définie par le code d'application ou lorsque l'entité dépendante est modifiée alors que cette fonction n'est pas disponible dans l'objet d'application.
Discutons des différentes politiques d'expiration et des dépendances soutenues.
La dépendance signifie qu'un élément peut être supprimé du cache lorsqu'une entité dépendante est modifiée. Ainsi, une relation dépendante peut être définie sur un élément dont le retrait du cache dépendra de la dépendance. Il existe deux types de dépendances pris en charge dans ASP.NET.
Exemple: disons que dans mon application, j'utilise un fichier XML pour stocker les détails d'erreur (numéro d'erreur et mappage de messages d'erreur) qui est utilisé pour récupérer un message d'erreur pour un numéro d'erreur donné lors de l'exécution. Donc, au lieu de lire le fichier à partir du disque chaque fois que j'ai besoin d'un message d'erreur, disons que je décide de le charger une fois au démarrage de l'application et de le stocker dans le cache ASP.NET pour une utilisation ultérieure. Donc, si j'ai besoin de modifier le fichier de configuration pour ajouter de nouveaux messages d'erreur ou modifier certains des messages d'erreur existants pendant l'exécution de l'application, alors qu'arrivera-t-il à mes données en cache? Dois-je arrêter l'application et recommencer pour refléter les modifications de fichier dans l'application? La réponse est non. Les données de cache peuvent être invalidées chaque fois que le fichier change en utilisant l'option de dépendance au fichier.
La stratégie d'expiration définit la stratégie pour comment et quand un élément du cache doit expirer.
L'objet Singleton à distance .NET partage la même instance avec plusieurs clients afin que les objets Singleton puissent être utilisés pour stocker et partager des données entre différentes invocations du client. Étant donné que le télécommande .NET peut être utilisé en dehors du processus et de la machine, cette option est très utile lorsque nous voulons mettre en cache des données et les partager entre les serveurs et les utilisateurs, en particulier dans un scénario de ferme Web. Dans cette approche, nous pouvons stocker les données en tant que variables membres de l'objet éloigné de Singleton et fournir des méthodes pour lire et enregistrer les données. Mais lors de la mise en œuvre de cela, nous devons nous assurer que l'objet à distance utilisé comme cache n'est pas détruit par le collecteur des ordures. Pour cela, nous devrons définir la période de location de l'objet de cache à distance à Infinite afin que la période de bail ne tire jamais. Nous pouvons le faire en remplaçant la méthode initialIFetimeService de MarshalByRefObject et renvoie NULL de cette méthode. Mais le seul problème avec cette approche est la performance. Comme l'analyse le dit, la performance est très médiocre dans cette approche par rapport à d'autres approches. Quoi qu'il en soit, il appartient aux concepteurs / développeurs d'applications d'analyser différentes options et d'utiliser le meilleur qui convient à l'exigence.
Vous savez tous ce qu'est un fichier mappé par la mémoire. Il s'agit essentiellement de cartographier un fichier sur le disque à une gamme spécifique d'adresses dans l'espace d'adresse de processus de l'application. Cette option permet à différents processus d'utiliser les mêmes données en augmentant les performances de l'application. Comme l'utilisation du fichier mappant en mémoire n'est pas très populaire parmi les développeurs .NET, je ne suggérerais personnellement pas cette approche car la mise en œuvre implique beaucoup de complexités et également .NET Framework ne prend pas en charge cela. Mais si quelqu'un est très intéressé à utiliser cette approche, il devra développer sa propre solution personnalisée selon ses propres exigences.
Nous utilisons des variables statiques pour stocker des données ou des objets à l'échelle mondiale afin qu'ils puissent être accessibles pendant la durée de vie de l'application. De même, dans ASP.NET, nous pouvons utiliser des objets statiques pour la mise en cache de données et nous pouvons également fournir des méthodes pour récupérer et enregistrer des données sur le cache. Comme les variables statiques sont stockées dans la zone de processus, les performances sont plus rapides. Mais comme il est très difficile de mettre en œuvre des politiques d'expiration et des dépendances en cas de variables statiques, je préfère généralement l'objet ASP.NET Cache à cette option. Un autre problème est que l'objet de cache statique personnalisé doit être un filetage qui doit être implémenté avec soin.
Nous pouvons également utiliser une base de données pour stocker des données et partager les données entre les utilisateurs et les machines. Cette approche est très utile lorsque nous voulons mettre en cache de grandes quantités de données. L'utilisation de cette approche pour stocker une petite quantité de données n'est pas une bonne idée en raison des performances. Pour stocker une petite quantité de données, nous devons opter pour d'autres mécanismes de mise en cache ASP.NET en cours. Comme les données doivent être stockées dans une base de données, tous les objets doivent être sérialisés XML afin qu'il soit plus facile de stocker et de récupérer. Nous pouvons également utiliser d'autres types de formats de sérialisation disponibles dans le framework .NET.
Parfois, dans notre application, dans certaines pages, la sortie ne change généralement pas pendant une période spécifique. Par exemple, sur un site Web RH, les détails du salaire d'un employé ne changent pas très fréquemment et il ne change qu'une seule fois par mois. Généralement, il ne change que le 1er jour de chaque mois. Ainsi, pendant un mois, la page des détails du salaire affichera les mêmes détails pour un employé en particulier. Donc, dans ce cas, n'est-ce pas une bonne idée de mettre la page quelque part dans le serveur pour éviter le traitement des calculs commerciaux, les appels à la base de données et la logique de rendu de page chaque fois que l'employé souhaite voir ses détails de salaire. À mon avis, oui! C'est une très bonne idée. Pour y parvenir, ASP.NET fournit une fonctionnalité pour stocker la sortie d'une page dans le serveur pendant une période de temps spécifique. Il fournit également des fonctionnalités pour stocker un fragment d'une page connue sous le nom de mise en cache des fragments de page.
Parfois, nous pouvons avoir besoin de mettre en cache des données ou des pages du côté client pour améliorer les performances de l'application. L'utilisation de ce mécanisme réduit la charge sur le serveur, mais ce mécanisme a des problèmes de sécurité car nous mettons les données du côté client.
Cookie est un stockage côté client qui est envoyé au serveur pour chaque demande et également reçu en réponse du serveur. En raison de sa limitation de taille, il doit être utilisé pour stocker une petite quantité de données. Les politiques d'expiration peuvent être définies pour les cookies pour invalider les éléments après une certaine période de temps.
ASP.NET ViewState est un concept uniquement dans les formulaires Web (pas MVC) où les données liées aux pages et aux contrôles sont stockées dans la page générée (côté client). qui conserve les valeurs sur plusieurs demandes au serveur. ViewState est implémenté en interne sous forme de champs cachés chiffrés dans ASP.NET. ViewState ne doit pas être utilisé pour stocker de grandes quantités de données car elle est transmise au serveur pour chaque demande.
Le champ caché est similaire à tout autre contrôle d'une page, mais l'état visible de ce contrôle est toujours faux. Comme Viewstate, nous ne devons pas l'utiliser pour stocker de grandes quantités de données. Les cadres cachés peuvent être utilisés pour mettre en cache les données du côté client, mais notez que les cadres cachés ne sont pas pris en charge par tous les navigateurs Internet.
Les navigateurs Internet fournissent un mécanisme de mise en cache pour mettre en cache les pages du côté client. Cela peut être défini à l'aide de la directive Expires ajoutée à l'en-tête des pages ou en la définissant manuellement dans le serveur Web. Nous devons utiliser cette option pour mettre en cache des pages statiques, scripts, CSS et images du côté client.
Fabriqué avec ❤️ par Javier Cañon.