Suivez votre progression
Accueil Trailhead
Accueil Trailhead

Visite guidée d'un exemple d'application et présentation des diagnostics de cache

Objectifs de formation

Une fois cette unité terminée, vous pourrez :

  • Expliquer un modèle de stockage et d'actualisation de données mises en cache.
  • Déterminer la structure des données à utiliser pour la valeur mise en cache.
  • Diagnostiquer votre utilisation du cache.

Visite guidée d'un exemple d'application

Examinons un exemple d'application qui montre comment utiliser le cache de l'organisation pour stocker et récupérer des taux de change de devises. Les taux de change fluctuent au cours de la journée. Cependant, cette application ne renvoie pas de taux en temps réel. Elle fournit uniquement un aperçu des taux de change quotidiens. Seules les valeurs quotidiennes nous intéressent ici, pas les valeurs précises en temps réel. Par conséquent, la mise en cache des taux de change de devises est un bon choix. Lorsque les taux de change sont consultés régulièrement, leur récupération à partir du cache permet de gagner du temps et d'améliorer les performances de l'application.

Présentation d'un exemple d'application

Notre exemple d'application de taux de change est basée sur une page Visualforce et un contrôleur Apex qui contient la logique de récupération des taux de change. Lors de l'accès initial à cette page, les taux sont récupérés à l'aide d'un appel d'API à un service Web externe. Les exécutions suivantes de cette page renvoient les taux à partir du cache si leur ancienneté est inférieure à un jour. Pour chaque taux de change, cette page affiche la devise de base, la devise cible de la conversion et le taux de conversion. Pour notre illustration, un jeu limité de devises est renvoyé.

Page Visualforce qui affiche les taux de change de devises

L'exemple de code ci-dessous correspond au balisage de la page Visualforce. Cette page est associée au contrôleur Apex ExchangeRates.

<apex:page controller="ExchangeRates" action="{!init}">
    
   <apex:pageBlock title="Rates">
      <apex:pageBlockTable value="{!Rates}" var="rate">
         <apex:column value="{!rate.Base_Currency__c}"/>
         <apex:column value="{!rate.To_Currency__c}"/>
         <apex:column value="{!rate.Rate__c }"/>
      </apex:pageBlockTable>
   </apex:pageBlock>
   
</apex:page>

Exemple de contrôleur Apex

Notre exemple de contrôleur Apex effectue les principales opérations. Il récupère les taux de change, les stocke dans Salesforce et dans le cache, et récupère les taux à partir du cache. Voici une répartition des opérations que l'exemple de contrôleur effectue, suivie du code source.

Lors de l'exécution initiale de l'exemple, les opérations suivantes sont effectuées :

  • Les taux de change sont obtenus à l'aide d'un appel d'API à un point de terminaison externe.
  • Le résultat (au format JSON) renvoyé par l'appel d'API est analysé et enregistré dans les sObjects Exchange_Rate__c, dans Salesforce.
  • La méthode getCachedRates() stocke le tableau des sObjects Exchange_Rate__c dans le cache de l'organisation.

Lors des exécutions suivantes de l'exemple, les opérations suivantes sont effectuées :

  • La date des données stockées est vérifiée. Pour cela, l'exemple exécute une requête SOQL afin de récupérer la valeur createdDate du premier enregistrement Exchange_Rate__c renvoyé.
  • Si la date est supérieure à un jour, les taux de change sont obtenus à l'aide d'un appel d'API, comme lors de la première exécution.
  • Si la date est inférieure à jour, les taux sont récupérés depuis le cache de l'organisation. En cas d'échec d'accès au cache, les taux sont récupérés en interrogeant les sObjects Exchange_Rate__c et stockés dans le cache de l'organisation.
Remarque

Remarque

Le contrôleur Apex utilise une classe helper Apex appelée RateLib, qui n'est pas montrée ici. Cette classe helper contient des méthodes pour exécuter un appel d'API externe à un service de taux de change, analyser le résultat JSON de l'appel d'API et stocker les enregistrements Exchange_Rate__c.

public class ExchangeRates {
    private String currencies = 'EUR,GBP,CAD,PLN,INR,AUD,SGD,CHF,MYR,JPY,CNY';
    public String getCurrencies() { return currencies;}
    public Exchange_Rate__c[] rates {get; set;}

    //                                                                          
    // Checks if the data is old and gets new data from an external web service 
    // through a callout. Calls getCachedRates() to manage the cache.           
    // 
    public void init() {
        // Let's query the latest data from Salesforce
        Exchange_Rate__c[] latestRecords = ([SELECT CreatedDate FROM Exchange_Rate__c 
                        WHERE Base_Currency__c =:RateLib.baseCurrencies 
                              AND forList__c = true 
                        ORDER BY CreatedDate DESC
                        LIMIT 1]);
        
        // If what we have in Salesforce is old, get fresh data from the API
        if ( latestRecords == null  
            || latestRecords.size() == 0 
            || latestRecords[0].CreatedDate.date() < Datetime.now().date()) {
            // Do API request and parse value out
            String tempString = RateLib.getLoadRate(currencies);
            Map<String, String> apiStrings = RateLib.getParseValues(
                tempString, currencies);
            
            // Let's store the data in Salesforce
            RateLib.saveRates(apiStrings);

            // Remove the cache key so it gets refreshed in getCachedRates()
            Cache.Org.remove('Rates');
        }
        // Call method to manage the cache
        rates = getCachedRates();
    }

    //                                                                          
    // Main method for managing the org cache.                                  
    // - Returns exchange rates (Rates key) from the org cache.                 
    // - Checks for a cache miss.                                               
    // - If there is a cache miss, returns exchange rates from Salesforce       
    //    through a SOQL query, and updates the cached value.                   
    //
    public Exchange_Rate__c[] getCachedRates() {
        // Get the cached value for key named Rates
        Exchange_Rate__c[] rates = (Exchange_Rate__c[])Cache.Org.get(
            RateLib.cacheName+'Rates');
        
        // Is it a cache miss? 
        if(rates == null) {
            // There was a cache miss so get the data via SOQL
            rates = [SELECT Id, Base_Currency__c, To_Currency__c, Rate__c 
                        FROM Exchange_Rate__c 
                        WHERE Base_Currency__c =:RateLib.baseCurrencies 
                              AND forList__c = true
                              AND CreatedDate = TODAY];
            // Reload the cache
            Cache.Org.put(RateLib.cacheName+'Rates', rates);
        }
        return rates;
    }
}

Si vous souhaitez télécharger la source de l'exemple de taux de change pour vous exercer dans votre organisation Developer, consultez la section Ressources.

Meilleures pratiques de gestion du cache

Modèle de stockage cache

La classe Apex ExchangeRates contient des méthodes qui incluent la logique d'initialisation et d'actualisation du cache. Si les données sont périmées ou introuvables, la méthode init() récupère les nouveaux taux de change à l’aide d’un appel d’API, puis les stocke dans Salesforce. La méthode getCachedRates() gère le cache en interne. Si la valeur mise en cache est introuvable, cette méthode récupère un tableau de taux depuis Salesforce et le stocke dans le cache.

Votre application utilise des données externes. Par conséquent, elle récupère les données de services Web à l'aide d'appels d'API. Elle stocke également les données dans des enregistrements Salesforce en tant que sauvegarde afin d'actualiser le cache. Les applications qui n'utilisent pas de données externes récupèrent les enregistrements Salesforce à l'aide de requêtes SOQL et les mettent en cache. Dans ce cas, le processus de gestion du cache est plus simple et l'implémentation de la méthode de cache est plus courte. Par exemple, si votre application utilise uniquement des données locales à l'aide de requêtes SOQL, la méthode init() n'est pas nécessaire, seule la méthode getCachedRates() est utile.

Nous recommandons d'inclure toute la logique de gestion du cache dans une seule méthode. Ainsi, le cache est manipulé à un seul emplacement dans votre application. La centralisation de la gestion du cache réduit le risque d'erreur d'accès à un cache non valide (échecs d'accès au cache) ou de remplacement accidentel des valeurs mises en cache.

Choix des éléments à mettre en cache

L'exemple ci-dessous stocke un tableau de sObjects en mémoire cache. Cette approche est-elle le meilleur choix de structure pour les données à stocker ? Chacun de vos choix fait l'objet de compromis. Le stockage de petites portions de données, telles que des valeurs de champ au lieu de sObjects complets, peut réduire l'utilisation de votre cache. Cependant, si vous stockez une quantité de données moins importante dans chaque clé, une logique plus complexe peut s'avérer nécessaire pour reconstruire les données et les sObjects, ce qui augmente le temps de traitement. En outre, un tableau de sObjects stocké dans une seule clé utilise un espace de cache inférieur à la taille totale des sObjects individuels stockés dans des clés individuelles. La mise en cache d'éléments plus petits à la place d'une liste d'éléments diminue les performances du cache, en raison de la surcharge de la sérialisation et du temps de validation du cache. Par exemple, au lieu de stocker une liste de taux (référencés par la variable de taux de cet extrait de code) :

Cache.Org.put('Rates', rates);

Vous pouvez stocker les taux individuels, chacun dans un champ avec sa propre clé de cache, en procédant comme suit :

Cache.Org.put('DollarToEuroRate', rateEUR);
Cache.Org.put('DollarToChineseYuan', rateCNY);
Cache.Org.put('DollarToJapaneseYen', rateJPY);
// etc.

Le choix de la structure des données à mettre en cache dépend des opérations que l'application effectue sur les données. Par exemple, si l'application convertit des valeurs à partir de la même devise de base, stockez au moins un taux de change pour chaque devise cible. Vous pouvez stocker le taux de chaque devise en tant que clé individuelle. Pour faciliter l'affichage des taux dans une page Visualforce, mettez les données en cache en tant que liste de sObjects. Les sObjects peuvent augmenter l'espace de stockage requis, car ils contiennent des champs système tels que la date de création, mais ils diminuent le temps de traitement de la logique et augmentent les performances de l'application et du cache. Ne perdez pas de vue qu'en utilisant le cache l'objectif principal est de réduire le temps d'exécution de l'application.

Diagnostic de l'utilisation du cache

Vous avez effectué toutes ces opérations pour implémenter le Cache de la plate-forme. Comment pouvez-vous déterminer l'efficacité de votre utilisation du cache ? Deux méthodes permettent de vérifier les données de performance. Vous pouvez consulter les informations de diagnostic dans la Configuration (disponibles uniquement dans Salesforce Classic).

Avant d'accéder à la page de diagnostic, activez l'autorisation de diagnostic du cache pour votre utilisateur.

  1. Dans Configuration, saisissez utilisateurs dans la case Recherche rapide, puis sélectionnez Utilisateurs.
  2. Cliquez sur votre nom d'utilisateur, puis sur Modifier.
  3. Activez Diagnostiques de la mémoire cache, puis cliquez sur Enregistrer.

Accédez ensuite à la page de diagnostic d'un type de cache spécifique d'une partition.

  1. Dans Configuration, saisissez cache dans la case Recherche rapide, puis sélectionnez Cache de la plate-forme.
  2. Cliquez sur la partition dont vous souhaitez vérifier les informations de diagnostic.
  3. Sous le cache de la session ou le cache de l'organisation, cliquez sur Diagnostics.

    La page Partition contient des liens vers les pages de diagnostic de chaque type de cache

Si vous cliquez sur Diagnostics sous le cache de l'organisation, la page Cache de l'organisation Diagnostics s'ouvre dans un nouvel onglet. La page contient deux graphiques. Le premier graphique (capacité et utilisation du cache de l'organisation) indique votre limite d'utilisation du cache. Dans notre cas, à 0,02 %, nous sommes bien en deçà de la limite. Le deuxième graphique (contribution par contenu) est un graphique en anneau qui indique la distribution du cache par clé.

Remarque

Remarque

Puisque notre exemple utilise le cache de l'organisation, seule la page de diagnostic du cache de l'organisation nous intéresse. Une page de diagnostic similaire est également disponible pour les applications qui utilisent le cache de la session.

L'image ci-dessous montre un graphique de distribution du contenu avec quatre clés de cache. L'une des clés de cache, Rates, est utilisée dans notre exemple de taux de change. La clé Rates occupe plus de la moitié de l'espace.

Page Diagnostics du cache de l'organisation

Les informations détaillées sur les clés de cache sont affichées sous les graphiques. La liste indique la taille de chaque valeur mise en cache correspondant à une clé ainsi que le nombre d'accès au cache. Vous pouvez supprimer un cache manuellement à partir de cette liste au lieu d'appeler la méthode remove() en Apex. Le bouton Supprimer permet aux administrateurs de gérer le cache sans modifier le code.

La clé DollarToEuroRate utilise moins d'espace que la clé Rates, car DollarToEuroRate stocke une seule valeur alors que Rates stocke un tableau de sObjects.

Utilisez les informations de la page Diagnostics pour ajuster votre utilisation du cache. Par exemple, si le nombre d'accès à une valeur en cache est faible, indiquant qu'elle est rarement utilisée, déterminez si elle est utile, particulièrement lorsque sa taille est importante. Si vous approchez de la limite maximale d'utilisation du cache, reconsidérez les éléments à conserver en mémoire cache. Vous pouvez retirer les valeurs en cache inutiles ou acheter une capacité en cache supérieure.

Félicitations ! Vous avez appris à utiliser le Cache de la plate-forme pour mettre les données de votre application en mémoire cache et accélérer leur récupération. Vous avez également découvert les meilleures pratiques de mise en cache et appris à diagnostiquer l'utilisation du cache. Vous pouvez maintenant suivre l'écureuil et mettre vos précieuses données en mémoire cache !