Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Schrittweise Anleitung für eine Beispielanwendung und Einführung in die Cache-Diagnose

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Erläutern eines Musters für die Speicherung und Aktualisierung im Cache zwischengespeicherter Daten
  • Bestimmen der für den zwischengespeicherten Wert zu verwendenden Datenstruktur
  • Diagnose der Cache-Nutzung

Schrittweise Anleitung für eine Beispielanwendung

Werfen wir einen Blick auf eine Beispielanwendung, die veranschaulicht, wie der Organisations-Cache zum Speichern und Abrufen von Wechselkursen verwendet wird. Wechselkurse schwanken im Verlauf eines Tages, sodass diese Beispielanwendung keine Echtzeitkurse liefert. Die Anwendung bietet lediglich eine tägliche Momentaufnahme von Wechselkursen. Da wir nicht an genauen Echtzeitwerten interessiert sind, sondern nur an Tageswerten, ist das Zwischenspeichern der Wechselkurse im Cache eine gute Wahl. Wenn Wechselkurse wiederholt abgerufen werden, spart das Abrufen aus dem Cache viel Zeit und verbessert die Leistung der Anwendung.

Übersicht über die Beispielanwendung

Unsere Beispielanwendung für Wechselkurse basiert auf einer Visualforce-Seite und einem Apex-Steuerfeld, das die Logik zum Abrufen von Wechselkursen enthält. Beim ersten Zugriff auf diese Seite werden die Kurse über einen API-Aufruf eines externen Webservice ermittelt. Nachfolgende Ausführungen dieser Seite geben die Kurse aus dem Cache zurück, solange die Kurse weniger als einen Tag alt sind. Für jeden Wechselkurs werden auf dieser Seite die Ausgangswährung, die Zielwährung für die Umrechnung und der Umrechnungskurs angezeigt. Zur Veranschaulichung wird eine kleine Menge von Währungen zurückgegeben.

Visualforce-Seite mit Währungswechselkursen

Dieses Beispiel ist das Markup der Visualforce-Seite. Diese Seite ist mit dem Apex-Steuerfeld ExchangeRates verknüpft.

<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>

Beispiel eines Apex-Steuerfelds

Unser Apex-Beispielsteuerfeld übernimmt die wichtigsten Aufgaben. Es dient zum Abrufen von Wechselkursen, deren Speicherung in Salesforce und im Cache sowie zum Abrufen von Kursen aus dem Cache. Hier ist eine Aufschlüsselung der Vorgänge, die das Beispielsteuerfeld durchführt, gefolgt vom Quellcode.

Beim ersten Ausführen des Beispiels finden die folgenden Vorgänge statt.

  • Die Wechselkurse werden über einen API-Aufruf an einen externen Endpunkt ermittelt.
  • Das vom API-Aufruf (im JSON-Format) zurückgegebene Ergebnis wird analysiert und in sObjects des Typs "Exchange_Rate__c" in Salesforce gespeichert.
  • Die getCachedRates()-Methode speichert das Array von sObjects des Typs "Exchange_Rate__c" im Organisations-Cache.

Dies erfolgt bei nachfolgenden Ausführungen des Beispiels:

  • Das Beispiel prüft, wie aktuell die gespeicherten Daten sind. Zu diesem Zweck erfolgt eine SOQL-Abfrage, um den Wert createdDate des ersten zurückgegebenen "Exchange_Rate__c"-Datensatzes abzurufen.
  • Wenn das Datum älter als ein Tag ist, werden die Wechselkurse wie bei der ersten Ausführung über den API-Aufruf abgerufen.
  • Ist das Datum jünger als ein Tag, werden die Kurse aus dem Organisations-Cache ausgelesen. Bei einem Cache-Fehlzugriff werden die Kurse aus sObjects des Typs "Exchange_Rate__c " abgefragt und im Organisations-Cache gespeichert.
Hinweis

Hinweis

Das Apex-Steuerfeld verwendet eine Apex-Hilfsklasse namens RateLib, die hier nicht gezeigt wird. Diese Hilfsklasse enthält Methoden, um den ausgehenden API-Aufruf an einen Wechselkurs-Service zu richten, das JSON-Ergebnis aus dem API-Aufruf zu analysieren und "Exchange_Rate__c"-Datensätze zu speichern.

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;
    }
}

Im Abschnitt "Ressourcen" können Sie den Quellcode des Beispiels für Wechselkurse herunterladen und mit ihm in Ihrer Developer Edition-Organisation experimentieren.

Bewährte Vorgehensweisen bei der Cache-Verwaltung

Muster für die Cache-Speicherung

Die Apex-Klasse ExchangeRates enthält Methoden, die die Logik der Initialisierung und Aktualisierung des Caches kapseln. Wenn die Daten veraltet sind oder nicht gefunden werden, ruft die init()-Methode neue Wechselkurse über einen API-Aufruf ab und speichert sie dann in Salesforce. Mit der getCachedRates()-Methode wird der Cache intern verwaltet. Wenn der zwischengespeicherte Wert nicht gefunden wird, ruft diese Methode ein Array von Kursen aus Salesforce ab und speichert es im Cache.

Da unsere Anwendung externe Daten verwendet, ruft sie über API-Aufrufe Daten von einem Webservice ab. Außerdem werden die Daten als Salesforce-Datensätze als Ersatz für die Aktualisierung des Caches gespeichert. Anwendungen, die keine externen Daten verwenden, rufen Salesforce-Datensätze mithilfe von SOQL ab und speichern sie im Cache. In diesem Fall ist die Cache-Verwaltung einfacher und die Implementierung der Cache-Methoden schneller. Falls Ihre Anwendung beispielsweise nur lokale Daten aus SOQL verwendet, benötigen Sie nicht die init()-Methode, sondern nur die getCachedRates()-Methode.

Wir empfehlen, die gesamte Logik zur Verwaltung des Caches in einer Methode zusammenzufassen. Auf diese Weise wird der Cache nur an einer Stelle in Ihrer Anwendung bearbeitet. Die zentrale Verwaltung des Caches reduziert das Risiko von Fehlzugriffen auf den Cache oder eines versehentlichen Überschreibens von Cache-Werten.

Entscheiden, was im Cache zwischengespeichert werden soll

Dieses Beispiel speichert ein Array von sObjects im Cache. Ist dieser Ansatz für die zu speichernden Datenstruktur am besten? Bei jeder Wahl, die Sie treffen, sind Kompromisse einzugehen. Das Speichern kleinerer Daten, wie z. B. von Feldwerten anstelle ganzer sObjects, kann den Umfang der Cache-Nutzung verringern. Wenn Sie jedoch weniger Daten in jedem Schlüssel speichern, benötigen Sie möglicherweise komplexe Logik, um die Daten und sObjects neu zu erstellen, was mehr Verarbeitungszeit erfordert. Und ein in einem Schlüssel gespeichertes sObject-Array belegt weniger Cache-Speicherplatz als die Gesamtgröße der in einzelnen Schlüsseln gespeicherten sObjects. Durch das Zwischenspeichern kleinerer Elemente anstelle einer Liste von Elementen verschlechtert sich die Cache-Leistung aufgrund des Aufwands für Serialisierung und der nötigen Zeit für den Commit im Cache. Anstatt beispielsweise eine Liste von Wechselkursen zu speichern (auf die von der Variablen "rates" in diesem Codeausschnitt verwiesen wird):

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

Können Sie die einzelnen Wechselkurse, jeweils als Feld mit eigenem Cache-Schlüssel, wie folgt speichern.

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

Die Entscheidung, welche Datenstruktur zwischengespeichert werden soll, hängt davon ab, was Ihre Anwendung mit den Daten macht. Wenn die Anwendung beispielsweise Währungen für dieselbe Basiswährung umrechnet, speichern Sie mindestens den Wechselkurs jeder Zielwährung. Sie können jeden Währungskurs als eigenen Schlüssel speichern. Um die Anzeige der Wechselkurse auf einer Visualforce-Seite zu vereinfachen, speichern Sie die Daten als Liste von sObjects im Cache. sObjects können mehr Speicherplatz beanspruchen, da sie Systemfelder wie das Erstellungsdatum enthalten, reduzieren aber die logische Verarbeitungszeit und erhöhen die Anwendungs- und Cache-Leistung. Denken Sie daran, dass das Hauptziel bei der Verwendung des Caches die Beschleunigung der Anwendungsausführung ist.

Diagnose der Cache-Nutzung

Sie haben alle für die Implementierung von Plattform-Cache erforderlichen Aufgaben erledigt. Doch woher wissen Sie, ob Sie den Cache optimal nutzen? Es gibt verschiedene Möglichkeiten zur Überprüfung von Leistungsdaten. Eine Möglichkeit besteht darin, die Diagnosedaten in Setup anzuzeigen (nur in Salesforce Classic verfügbar).

Bevor Sie die Diagnoseseite aufrufen, aktivieren Sie für Ihren Benutzer die Cache-Diagnoseberechtigung.

  1. Geben Sie in Setup im Feld Schnellsuche den Text Benutzer ein und wählen Sie dann Benutzer aus.
  2. Klicken Sie auf Ihren Benutzernamen und dann auf Bearbeiten.
  3. Wählen Sie Cache-Diagnose aus und klicken Sie dann auf Speichern.

Rufen Sie anschließend die Diagnoseseite für einen bestimmten Cache-Typ in einer Partition auf.

  1. Geben Sie in Setup im Feld Schnellsuche den Text Cache ein und wählen Sie dann Plattform-Cache aus.
  2. Klicken Sie auf die Partition, deren Diagnosedaten Sie überprüfen möchten.
  3. Klicken Sie unter "Sitzungs-Cache" oder "Organisations-Cache" auf Diagnose.

    Partitionsseite mit Links zu den Diagnoseseiten für jeden Cache-Typ

Wenn Sie für den Organisations-Cache auf Diagnose klicken, wird die Seite "Organisations-Cache-Diagnose" auf einer neuen Registerkarte geöffnet. Diese Seite enthält zwei Diagramme. Das erste (Org Cache Capacity and Usage [Organisations-Cache-Kapazität und -Auslastung]) zeigt den Grenzwert Ihrer Cache-Nutzung. In unserem Fall liegen wir mit 0,02% weit unter dem Grenzwert. Das zweite (By Content Contribution [Nach Inhaltsbeitrag]) ist ein Ringdiagramm mit der Cache-Verteilung nach Schlüssel.

Hinweis

Hinweis

Da unser Beispiel den Organisations-Cache verwendet, überprüfen wir nur die Diagnoseseite für den Organisations-Cache. Für Anwendungen, die den Sitzungs-Cache verwenden, steht eine ähnliche Diagnoseseite zur Verfügung.

Die folgende Abbildung zeigt ein Inhaltsverteilungsdiagramm mit vier Cache-Schlüsseln. Einer der Cache-Schlüssel, Rates, wird in unserem Wechselkursbeispiel verwendet. Der Schlüssel Rates belegt mehr als die Hälfte des Speicherplatzes.

Diagnoseseite für den Organisations-Cache

Auf die Diagramme folgen Details zu den Cache-Schlüsseln. Diese Liste gibt die Größe jedes zwischengespeicherten Werts an, der einem Schlüssel entspricht, und die Anzahl der Zugriffe auf den Cache. Als Alternative zum Aufrufen der remove()-Methode in Apex können Sie einen Cache manuell aus dieser Liste löschen. Mithilfe der Schaltfläche Löschen können Administratoren den Cache verwalten, ohne den Code zu ändern.

Der Schlüssel DollarToEuroRate belegt deutlich weniger Speicherplatz als der Schlüssel Rates. Das ist zu erwarten, denn der Schlüssel DollarToEuroRate speichert nur einen Wert, während Rates ein Array von sObjects speichert.

Bestimmen Sie anhand der Informationen auf der Diagnoseseite, ob Ihre Cache-Nutzung angepasst werden sollte. Wenn z. B. ein Cache-Wert eine niedrige Anzahl von Zugriffen aufweist, was bedeutet, dass er selten verwendet wird, überlegen Sie, ob er wirklich benötigt wird, besonders wenn er groß ist. Oder wenn Sie sich dem Grenzwert für die Cache-Nutzung nähern, überlegen Sie erneut, was Sie zwischenspeichern sollten. Sie können unnötige Cache-Werte entfernen oder mehr Cache-Kapazität erwerben.

Herzlichen Glückwunsch! Sie haben gelernt, wie Sie Plattform-Cache verwenden, um die Daten Ihrer Anwendung für einen schnellen Abruf zwischenzuspeichern. Außerdem haben Sie sich mit den besten Cache-Verfahren und der Diagnose der Cache-Nutzung vertraut gemacht. Sie sind jetzt bereit, an den Abenteuern des Eichhörnchens teilzunehmen und wertvolle Ressourcen zwischenzuspeichern!