1. Présentation Dans les applications Web, la génération de certains rapports peut prendre beaucoup de temps pour que la base de données calcule ; certains sites Web fournissent des informations météorologiques, ce qui nécessite l'accès à un serveur distant pour effectuer un appel SOAP afin d'obtenir des informations sur la température. Ce sont tous des exemples d’informations complexes. L'ajout d'informations trop complexes à une page Web peut entraîner une surcharge du serveur Web et du serveur de base de données. La mise en mémoire tampon des blocs de code JSP donne aux développeurs la liberté d'ajouter toutes sortes d'informations complexes à volonté.
JSP peut encapsuler et exécuter du code Java complexe dans la bibliothèque de balises, ce qui facilite la maintenance des fichiers de page JSP et permet aux développeurs non professionnels d'utiliser plus facilement les fichiers de page JSP. Il existe déjà de nombreuses bibliothèques de balises, qui sont soit des produits commerciaux, soit des produits open source. Mais la plupart de ces produits utilisent uniquement des bibliothèques de balises pour implémenter des fonctions qui peuvent être implémentées avec un simple script Java. Peu de produits utilisent des balises personnalisées de manière créative, offrant presque les mêmes fonctionnalités qu'avant l'émergence des bibliothèques de balises personnalisées JSP.
La bibliothèque de balises OSCache, conçue par OpenSymphony, est une application de balises personnalisées JSP révolutionnaire qui fournit une mise en cache mémoire rapide dans les pages JSP existantes. Bien qu'il existe quelques fournisseurs proposant des produits de mise en cache sous diverses formes, il s'agit tous de produits spécifiques au fournisseur. OSCache peut s'exécuter sur n'importe quel serveur compatible JSP 1.1 et peut mettre en cache les blocs de code JSP existants non seulement pour tous les utilisateurs, mais également pour chaque utilisateur. OSCache comprend également certaines fonctionnalités avancées pour améliorer l'évolutivité, telles que la mise en mémoire tampon sur disque, le vidage de tampon programmable, le contrôle des exceptions, etc. De plus, comme d'autres produits OpenSymphony, le code d'OSCache est distribué gratuitement sous une licence open source.
Cet article prend comme exemple un processus de conception de site Web d'enchères imaginaire pour présenter le processus de travail d'OSCache. Ce site Web hypothétique contiendrait :
1 : Une page administrative signalant l'activité récente des enchères ;
2 : Une page d’accueil avec des fonctions complètes et diverses informations promotionnelles ;
3 : Une barre de navigation spéciale qui contient toutes les informations sur les enchères de l’utilisateur qui n’ont pas encore été complétées.
2. Page de gestion
Le site Web d'enchères contient un rapport de gestion et il faut plusieurs secondes au serveur de base de données pour créer un tel rapport. Il est important que la génération du rapport prenne beaucoup de temps, car plusieurs administrateurs peuvent surveiller le fonctionnement du système et nous voulons éviter de régénérer le rapport à chaque visite de l'administrateur. Pour y parvenir, nous encapsulerons la page entière dans une balise tampon au niveau de l’application qui est actualisée toutes les heures. Certains produits d'autres fournisseurs ont des fonctionnalités similaires, mais OSCache le fait mieux qu'eux.
Par souci de simplicité, nous ne nous concentrerons pas trop sur les questions de formatage. Lors de l'écriture de la page de gestion, nous ajoutons d'abord la déclaration de la bibliothèque de balises à la page :
<%@ taglib uri="cachetags" prefix="cache" %>
Ensuite, nous devons entourer la page entière de balises de cache. La durée de cache par défaut pour les balises de cache est de 1 heure.
<cache:cache> .... Rapports de gestion complexes.... </cache:cache>
La page de gestion est désormais mise en cache. Si l'administrateur accède à nouveau à la même page dans l'heure qui suit la génération de la page, il verra la page précédemment mise en cache et le serveur de base de données n'aura pas besoin de générer à nouveau ce rapport.
3. Page d'accueil La page d'accueil du site Web d'enchères affiche les activités du site Web et fait la promotion des enchères sur le point de se terminer. Nous souhaitons afficher le nombre d'enchères en cours, le nombre d'utilisateurs actuellement connectés, une liste des enchères qui doivent se terminer dans un avenir proche et l'heure actuelle. Ces messages ont des exigences différentes en matière de précision temporelle. Les enchères sur le site Web durent généralement plusieurs jours, nous pouvons donc régler le temps nécessaire pour tamponner le nombre d'enchères valides à 6 heures. Le nombre d'utilisateurs changera évidemment plus fréquemment, mais ici nous mettrons en mémoire tampon cette valeur pendant 15 minutes à la fois. Enfin, nous voulons que l'heure actuelle affichée sur la page soit toujours l'heure exacte à laquelle la page a été consultée.
Après avoir déclaré la bibliothèque de balises dans la page d'accueil, nous affichons d'abord la date actuelle directement sans mise en mémoire tampon :
elle est maintenant : <%=new java.util.Date()%>
Ensuite, nous souhaitons afficher une liste de celles qui seront mises aux enchères. qui se terminent à court terme :
<cache:cache> <ul> <% // Construire un itérateur contenant les enchères récentes Iterator Auctions = .... while (auctions.hasMore()) { Auction Auction = (Auction) Auctions.next (); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Enfin, nous souhaitons afficher le nombre d'enchères en cours, ce nombre doit être tamponné pendant 6 heures. Étant donné que le marquage du cache nécessite un certain nombre de secondes pour mettre les données en mémoire tampon, nous convertissons 6 heures en 21 600 secondes :
<cache:cache time="21600"> <% //Interrogez la base de données pour obtenir le nombre total d'activités d'enchères int AuctionCount = .. .. %> Il y a <%=auctionCount%> enchères en cours sur ce site ! </cache>
Comme vous pouvez le constater, nous n'utilisons qu'une petite quantité de code pour construire une page d'accueil avec un système de mise en mémoire tampon complexe. Ce système de mise en mémoire tampon met en mémoire tampon chaque partie de la page séparément, et le temps de mise en mémoire tampon de chaque partie est entièrement cohérent avec la fréquence des changements dans leurs informations respectives. Grâce au buffering, nous pouvons désormais mettre plus de contenu sur la page d'accueil ; sans buffering auparavant, mettre trop de contenu sur la page d'accueil ralentira l'accès à la page, et peut même causer des problèmes pour le serveur de base de données.
4. Barre de navigation Supposons que lors de la planification du site Web, nous décidions d'afficher le contenu du panier sous la barre de navigation de gauche. Nous afficherons le nombre d'offres et le prix actuel pour chaque article mis aux enchères par l'utilisateur, ainsi qu'une liste de tous les articles pour lesquels l'utilisateur actuel a l'enchère la plus élevée.
Nous utilisons des capacités de mise en mémoire tampon au niveau de la session pour construire la fonctionnalité ci-dessus dans la barre de navigation. Mettez le code suivant dans le modèle ou incluez le fichier afin que les autres pages du site Web puissent référencer cette barre de navigation :
<cache:cache key="navbar" scope="session" time="300"> <% //Extraire et afficher les informations sur l'offre actuelle%> </cache:cache>
Nous introduisons ici deux attributs importants, à savoir la clé et la portée. Dans le code plus haut dans cet article, puisque la balise de cache peut créer automatiquement une clé unique pour le bloc de code, nous n'avons pas besoin de définir cet attribut de clé manuellement. Mais ici, nous voulons référencer ce bloc de code mis en cache à partir du reste du site, nous définissons donc explicitement l'attribut key de la balise cache. Deuxièmement, l'attribut scope est utilisé pour indiquer au cache de marquer que le bloc de code actuel doit être mis en mémoire tampon pour chaque utilisateur, plutôt que de le mettre en mémoire tampon une fois pour tous les utilisateurs.
Vous devez être très prudent lorsque vous utilisez la mise en mémoire tampon au niveau de la session, et cela doit être clair : même si nous pouvons créer une barre de navigation complexe pour réduire la charge du serveur de 5x ou 10x, cela augmentera considérablement l'espace mémoire requis par session. Il est sans doute idéal d'augmenter le nombre d'utilisateurs simultanés possibles en termes de capacités du CPU, mais une fois que le nombre d'utilisateurs simultanés est réduit à la limite du CPU en termes de capacités de support mémoire, cette solution n'est plus idéale.
Comme mentionné plus tôt dans cet article, nous souhaitons référencer ce bloc de code mis en mémoire tampon à partir du reste du site. En effet, lorsqu'un utilisateur ajoute un article aux enchères ou enchérit pour des articles mis aux enchères par d'autres utilisateurs, nous souhaitons actualiser le tampon afin que la barre de navigation contienne le contenu le plus récent lors de sa prochaine lecture. Bien que ces données puissent changer en raison de l'activité d'autres utilisateurs, il peut être très déroutant pour un utilisateur de constater que son annonce reste inchangée après avoir effectué une action sur le site.
La balise de vidage fournie par la bibliothèque OSCache peut actualiser le contenu du tampon. Nous pouvons ajouter le code suivant à la page qui gère les actions de l'utilisateur pouvant affecter cette zone :
<cache:flush key="navbar" scope="session" />
Lorsque l'utilisateur y accédera la prochaine fois, le bloc tampon de la barre de navigation sera actualisé .
Jusqu'à présent, la construction de notre exemple de site Web est terminée et peut commencer à fonctionner. Jetons un coup d'œil aux capacités de gestion des exceptions d'OSCache. Même si le contenu mis en mémoire tampon a été invalidé, comme une exception Java se produisant dans le bloc tampon, la bibliothèque de balises OSCache nous permet toujours d'afficher le contenu par programme. Avec cette fonctionnalité de contrôle des exceptions, nous pouvons supprimer la connexion entre le serveur de base de données et le serveur Web, et le site Web pourra toujours continuer à fonctionner. La spécification JSP 1.2 a introduit l'interface TryCatchFinally, qui permet à la balise elle-même de détecter et de gérer les exceptions Java. Par conséquent, le balisage peut être combiné avec ce code de gestion des exceptions pour rendre les pages JSP plus simples et plus organisées.
OpenSymphony prévoit d'implémenter des mécanismes de mise en mémoire tampon supplémentaires ainsi qu'un système principal plus gérable qui nous permettra de gérer la RAM et l'espace disque utilisés par la mise en mémoire tampon. Une fois ces fonctionnalités mises en place, nous pourrons encore améliorer la réactivité et la fiabilité du site internet.
Exemple d'utilisation :
assistant de configuration de fichier oscache.properties
cache.memory
La valeur est vraie ou fausse. La valeur par défaut est de mettre en cache en mémoire.
S'il est défini sur false, le cache ne peut être mis en cache que dans la base de données ou le disque dur, alors quel est l'intérêt du cache :)
cache.capacity
Nombre d'éléments de cache
cache.persistence.class
Classe de cache persistant, si cette classe est activée, vous devez définir les informations cache.path
cache.cluster liées aux informations de configuration du cluster.
comme
cache.cluster.multicast.ip est l'adresse IP de diffusion
cache.cluster.properties est les propriétés du cluster
3. L'utilisation de base d'OSCache
cache1.jsp est la suivante
<%@ page import="java.util.*" %>
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
Aucune date en cache : <%= new Date() %><p>
<!--Actualisation automatique-->
<cache:temps de cache="30">
Actualisez la date mise en cache toutes les 30 secondes : <%= new Date() %>
</cache:cache>
<!--Actualisation manuelle-->
<cache:cache key="testcache">
Actualisez manuellement la date mise en cache : <%= new Date() %> <p>
</cache:cache>
<a href="/cache2.jsp">Actualisation manuelle</a>
</body>
</html>
cache2.jsp effectue un rafraîchissement manuel de la page comme suit
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
Le cache a été vidé...<p>
<cache:flush key="testcache" scope="application"/>
<a href="/cache1.jsp">Retour</a>
</body>
</html>
Vous pouvez également définir la portée effective du cache via l'instruction suivante. Si vous ne définissez pas la portée, la portée par défaut est Applcation.
<cache:cache time="30" scope="session">
...
</cache:cache>
4. Filtre de cache CacheFilter
Vous pouvez définir un filtre de cache dans web.xml pour définir le cache de ressources spécifiques.
1 <filtre>
2 < filtre - nom > CacheFilter </ filtre - nom >
3 < filtre - classe > com.opensymphony.oscache.web.filter.CacheFilter </ filtre - classe >
4 <paramètre d'initialisation>
5 <param-name>heure</param-name>
6 < valeur param > 60 </ valeur param >
7 </init-param>
8 <paramètre d'initialisation>
9 <param-name>portée</param-name>
10 <param-value>session</param-value>
11 </init-param>
12 </ filtre >
13
14
15 <filtrage-mapping>
16 < filtre - nom > CacheFilter </ filtre - nom >
17 <url-modèle>* .jsp </url-modèle>
18 </ filtre - mappage >
La définition ci-dessus mettra en cache toutes les pages .jsp, le temps d'actualisation du cache est de 60 secondes et la portée du cache est Session.
Notez que CacheFilter capture uniquement les demandes de page avec un en-tête Http de 200, c'est-à-dire qu'il met uniquement en cache les demandes sans erreurs.
Au lieu de mettre en cache d'autres requêtes (telles que 500, 404, 400)
[Conclusion] OSCache peut nous aider à créer un site Web plus coloré et plus performant. Avec l'aide de la bibliothèque de balises OSCache, nous pouvons désormais l'utiliser pour résoudre certains problèmes qui affectent la réactivité du site Web, comme les périodes de pointe de trafic, les serveurs de bases de données surchargés, etc.
Conseil personnel : si vous utilisez Struts ou une autre architecture MVC, il est difficile de profiter de l'amélioration des performances apportée par la balise oscache, car chaque requête doit toujours être soumise à une action - dao - ou autre chose pour le traitement. Par conséquent, pour utiliser la mise en cache. , vous avez besoin d'autres méthodes, telles que la mise en cache au niveau de la méthode dans l'intercepteur Spring... Si tous vos codes de traitement métier sont écrits dans des pages jsp, vous pouvez utiliser des balises de cache pour mettre en cache les données de page générées précédemment afin d'éviter d'effectuer les mêmes opérations commerciales.