Invalidation des données en mémoire cache

Pour maintenir à jour les données en mémoire cache (en fonction de l'heure, de l'utilisateur ou d'autres variables), il faut les invalider ou les supprimer de la mémoire cache. Dynacache offre plusieurs méthodes d'invalidation du cache. Il existe quatre méthodes d'invalidation du cache.

Invalidation basée sur le temps

L'invalidation basée sur le temps est utile lorsque les entrées de mémoire cache ne peuvent pas être invalidées par un autre mécanisme ou devraient être actualisées à l'issue d'une période prédéfinie. Cette méthode peut être exécutée en spécifiant le sous-élément <timeout>value</timeout> avec un élément cache-entry dans le fichier cachespec.xml. Value représente l'intervalle de temps, en secondes, pendant lequel l'entrée de cache est conservée en mémoire cache. La valeur par défaut de cet élément est 0, ce qui indique que cette entrée n'arrive jamais à expiration. Pour plus d'informations sur la façon d'utiliser la balise <timeout> (délai d'expiration), voir Configuring cacheable objects with the cachespec.xml file.

Par exemple, l'invalidation basée sur le temps est justifiée pour la mise en mémoire cache d'un emplacement e-Marketing. En général, les emplacements e-Marketing ne doivent pas être mis en mémoire cache car le résultat de la page est généré dynamiquement en fonction de données personnalisées. Mais si l'administrateur du magasin souhaite privilégier les performances par rapport au fonctionnement, les JSP de l'emplacement e-Marketing peuvent être mis en mémoire cache sans sous-élément de dépassement de délai d'attente, le résultat pouvant ainsi être réutilisé pendant un certain intervalle de temps.

Le sous-élément "timeout" permet de définir une durée de vie (TTL, Time-To-Live) pour l'entrée de cache basée sur le dernier accès à l'entrée de cache. Il s'agit d'un sous-élément de l'élément cache-id. <inactivity>value<inactivity> où "value" représente la durée, exprimée en secondes, pendant laquelle l'entrée de cache doit être conservée dans le cache après le dernier accès en mémoire cache. Cet élément se révèle particulièrement utile pour les entrées de cache dépendant de l'utilisateur pour lesquelles une durée de session utilisateur moyenne peut être spécifiée comme délai d'expiration d'inactivité.

Invalidation basée sur les instructions

L'invalidation se produit après l'exécution d'une instruction, conformément aux règles d'invalidation, qui part de l'interface de programmation d'application HCL Commerce Command Framework. Les ID d'invalidation pour l'invalidation à l'aide de commandes sont créés à partir des méthodes et des zones fournies par les commandes.

Pour qu'un appel de commande soit intercepté par la mémoire cache dynamique, vous devez écrire la commande dans la structure de commandes WebSphere Command Framework dans sa classe d'implémentation débutant à CacheableCommandImpl (dans le module com.ibm.websphere.command). Pour simplifier l'écriture d'instructions pour l'invalidation basée sur les instructions, HCL Commerce a mis à jour les classe abstraites, ControllerCommandImpl et TaskCommandImpl. Elles sont désormais basées sur CacheableCommandImpl, ce qui fait que toute commande basée ces classes abstraites est également basée sur CacheableCommandImpl et peut donc être utilisée pour l'invalidation.

Lors de la génération des stratégies d'invalidation à l'aide de commandes dans cachespec.xml, gardez à l'esprit les restrictions suivantes :

  • Seules les méthodes appelées par la commande qui renvoient les variables d'instance d'entrée peuvent être utilisées dans le composant (component) "method".
  • Toutes les méthodes utilisées pour la création des ID d'invalidation doivent être précisées dans l'interface de l'instruction et mises en oeuvre.
  • Le composant de type demande d'attributs ne peut pas être utilisé.

Invalidation de la table CACHEIVL et de l'API Dynacache

La mise en cache dynamique de WebSphere Application Server fournit les API suivantes pour permettre l'invalidation par programme

  • com.ibm.websphere.cache.DistributedMap
  • com.ibm.wsspi.cache.Cache
  • com.ibm.websphere.cache.Cache

HCL Commerce fournit une commande DynaCacheInvalidation qui est périodiquement appelée par le planificateur pour traiter les enregistrements de la table CACHEIVL et appeler la mémoire cache dynamique WebSphere Application Server. Par défaut, l'intervalle de planification est de quatre minutes.

La commande DynaCacheInvalidation est normalement exécutée en tant que travail de planificateur, mais elle peut également être invoquée en tant que commande URL. Si vous devez effacer manuellement le cache par défaut et tous les caches d'objets de cache de données, vous pouvez utiliser la commande URL DynaCacheInvalidation avec le paramètre clear=true.

Invalidation basée sur un groupe

Les arborescences de dépendance vous permettent de créer des regroupements conceptuels des entrées de cache (cache-entry) et d'effectuer des invalidations en fonction de ces groupes.

Vous pouvez spécifier des identificateurs de groupe de mémoire cache supplémentaires pour associer plusieurs entrées de cache sous le même identificateur de groupe dans cachespec.xml. Le nombre des identificateurs (ID de dépendance) pouvant être définis dans une entrée de cache n'est pas limité. Vous pouvez définir plusieurs ID de dépendance pour la même entrée de cache et le même identificateur de dépendance peut être réutilisé pour une autre entrée de cache. Ce mécanisme permet de supprimer simultanément toutes les entrées de cache connexes via une seule règle.

Vous trouverez ci-après un exemple dans lequel les mêmes ID de dépendance et storeId ont été définis pour chacune des entrées de cache de page du catalogue. A la fin, une règle d'invalidation est fournie. Dans cette règle, l'ID d'invalidation est généré de façon à correspondre à l'ID de dépendance lorsque la règle intercepte l'appel d'instruction lancé à StoreStyleUpdateCmd. Lors de l'exécution, une fois que la mémoire cache dynamique a généré l'ID d'invalidation, il s'opère une comparaison entre chaque ID de dépendance pour le même identificateur et les valeurs provenant des entrées de cache. Toutes les entrées de cache de page de catalogue regroupées sous l'ID de dépendance sont supprimées.

Exemple d'invalidation basée sur un groupe :


<cache-entry>
 <class>servlet</class>
 
<name>/Tooltech/ShoppingArea/CatalogSection/CategorySubsection/CachedStoreCatalogDisplay.jsp</name>
     . . .
       <dependency-id>storeId
                <component id="storeId"
type="parameter">
                 <required>true</required>
               </component>
  </dependency-id>
</cache-entry>

<cache-entry>
        <class>servlet</class>
       
<name>/Tooltech/ShoppingArea/CatalogSection/CategorySubsection/CachedTopCategoriesDisplay.jsp</name>
        . . .
        <dependency-id>storeId
                <component id="storeId" type="parameter">
                        <required>true</required>
                </component>
        </dependency-id>
</cache-entry>

<cache-entry>
        <class>servlet</class>
       
<name>/Tooltech/ShoppingArea/CatalogSection/CategorySubsection/CachedCategoryDisplay.jsp</name>
       
<name>/Tooltech/ShoppingArea/CatalogSection/CategorySubsection/CategoriesRouter.jsp</name>
        . . .
        <dependency-id>storeId
                <component id="storeId" type="parameter">
                        <required>true</required>
                </component>
        </dependency-id>
</cache-entry>

<cache-entry>
        <class>servlet</class>
       
<name>/Tooltech/ShoppingArea/CatalogSection/CategorySubsection/CachedProductDisplay.jsp</name>
       
<name>/Tooltech/ShoppingArea/CatalogSection/CategorySubsection/CachedItemDisplay.jsp</name>
        . . .
        <dependency-id>storeId
                <component id="storeId" type="parameter">
                        <required>true</required>
                </component>
        </dependency-id>
</cache-entry>

<cache-entry>
        <class>command</class>
       
<name>com.ibm.commerce.tools.devtools.store.commands.StoreStyleUpdateCmdImpl</name>
        . . .
        <invalidation>storeId
                <component id="getStoreId" type="method">
                        <required>true</required>
                </component>
        </invalidation>
</cache-entry>