Verwenden von Organisations- und Sitzungs-Cache
Lernziele
- Erstellen einer Partition
- Speichern und Abrufen von Werten im Organisations- und Sitzungs-Cache
- Beschreiben, wie lange die Werte im Cache verbleiben
- Umgang mit Cache-Fehlzugriffen
- Lesen von Daten aus dem Sitzungs-Cache auf einer Visualforce-Seite
Erstellen einer Partition
Um Plattform-Cache zu verwenden, richten Sie zunächst mindestens eine Partition ein. Nachdem Sie Partitionen eingerichtet haben, können Sie über die Apex-API für Plattform-Cache Daten hinzufügen, darauf zugreifen und diese entfernen.
Jede Partition verfügt über ein Sitzungs-Cache- und ein Organisations-Cache-Segment. Sie können jedem Segment eine eigene Kapazität zuteilen. Üblicherweise weisen Sie Ihrer Partition mindestens 5 MB zu. Bei diesem Beispiel weisen wir keinen Speicherplatz zu, um sicherzustellen, dass Ihr Code ordnungsgemäß mit Cache-Fehlzugriffen umgeht. Wenn kein Speicherplatz zugewiesen wird, ist die Cache-Fehlzugriffsrate 100 %, was bedeutet, dass Cache-Werte nicht im Cache gefunden werden, und die Methode get() gibt NULL zurück. Verwenden Sie diese Vorgehensweise, um auf Cache-Fehlzugriffe zu testen. Wie Sie mit Cache-Fehlzugriffen umgehen sollten, erfahren Sie in einem späteren Abschnitt.
Legen wir zunächst auf der Seite "Plattform-Cache" (nur in Salesforce Classic verfügbar) eine Partition an.
- Geben Sie unter "Setup" im Feld "Schnellsuche" den Text "Platform Cache" ein und wählen Sie dann Platform Cache aus.
- Klicken Sie auf New Platform Cache Partition (Neue Plattform-Cache-Partition).
- Geben Sie der Partition einen Namen (z. B. den Namen Ihrer Anwendung).
- Aktivieren Sie Default Partition (Standardpartition).
- Geben Sie 0 für den Sitzungs-Cache und 0 für den Organisations-Cache ein. Klicken Sie dann auf Save (Speichern).
Format des Cache-Schlüsselnamens
Ein Cache-Schlüssel hat das folgende Format:
Namespace.Partition.Key
"Namespace" ist der Namespace der Organisation, in der die Anwendung ausgeführt wird, der auch auf den speziellen Namen "local" festgelegt werden kann. Der Name "local" bezieht sich auf den Namespace Ihrer Organisation, d. h. ob ein Namespace in der Organisation definiert wurde oder nicht.
"Partition" ist der Name der Partition, die Sie erstellt haben. In diesem Beispiel lautet er "CurrencyCache".
"Key" ist der Name des Schlüssel, den Sie zum Speichern eines Werts verwendet haben. Der Schlüsselname steht eindeutig für Ihren Wert im Cache.
Angenommen, wir möchten den Wechselkurs von US-Dollar in Euro speichern. Wir können einen Schlüssel namens DollarToEuroRate erstellen. Für die gerade erstellte Partition lautet der vollständige Name des Schlüssels:
local.CurrencyCache.DollarToEuroRate
Dieser Codeausschnitt speichert beispielsweise einen Wert für den Schlüssel "DollarToEuroRate" im Organisations-Cache.
Cache.Org.put('local.CurrencyCache.DollarToEuroRate', '0.91');
Die von uns erstellte Partition ist eine Standardpartition, sodass Sie den Namespace und den Partitionsnamen weglassen können und nur den Schlüsselnamen angeben.
DollarToEuroRate
Wenn Sie eine Standardpartition verwenden, können Sie den Aufruf von "put()" auf Folgendes verkürzen.
Cache.Org.put('DollarToEuroRate', '0.91');
Speichern und Abrufen von Daten im Organisations-Cache
Sie haben die Einrichtung von Partitionen abgeschlossen, was der einzige Schritt auf der Benutzeroberfläche ist. Nun wechseln wir zu Apex, um den Cache zu verwalten. Verwenden Sie den Organisations-Cache zum Speichern von Daten, die allen in der Organisation zur Verfügung stehen. Verwenden Sie entweder die Methoden der Cache.Org-Klasse oder die Cache.OrgPartition-Klasse, um auf eine bestimmte Partition zu verweisen. Rufen Sie dann die Cache-Methoden für diese Partition auf.
Der folgende Apex-Codeausschnitt zeigt, wie auf eine Partition mit der Cache.OrgPartition-Klasse zugegriffen werden kann, um einen Cache-Wert für eine Wechselkursanwendung zu speichern und abzurufen. Die Klasse ruft die Partition namens "CurrencyCache" im lokalen Namespace ab. Ein neuer Wert wird mit dem Schlüssel DollarToEuroRate und dem heutigen Wechselkurs hinzugefügt. Als Nächstes wird der Wert des Schlüssels DollarToEuroRate aus dem Cache abgerufen.
// Get partition Cache.OrgPartition orgPart = Cache.Org.getPartition('local.CurrencyCache'); // Add cache value to the partition. Usually, the value is obtained from a // callout, but hardcoding it in this example for simplicity. orgPart.put('DollarToEuroRate', '0.91'); // Retrieve cache value from the partition String cachedRate = (String)orgPart.get('DollarToEuroRate');
Wenn Sie Cache-Werte in nur einer Partition verwalten, verwenden Sie die Cache.OrgPartition-Methoden. Die Cache.OrgPartition-Methoden sind einfacher zu verwenden als die Cache.Org-Methoden, da Sie den Namespace und das Partitionspräfix nur beim Anlegen des Partitionsobjekts einmal angeben.
Bleiben im Cache zwischengespeicherte Werte für immer erhalten?
Das vorherige Beispiel geht davon aus, dass alles richtig läuft, nämlich dass:
- Plattform-Cache aktiviert ist und über eine Partition mit freiem Speicherplatz verfügt
- der zwischengespeicherte Wert im Cache gefunden wird
- der Wert erfolgreich im Cache gespeichert wurde
Doch in der Praxis sind zwischengespeicherte Daten nicht immer garantiert verfügbar. Plattform-Cache ist als temporärer Speicherplatz gedacht. Der Cache kann beispielsweise abgelaufen sein. Selbst wenn der Cache noch aktiv ist, kann es sein, dass Ihre zwischengespeicherten Daten aus dem Cache entfernt werden. Genau wie Eichhörnchen ihre Backen räumen, um Platz für mehr Eicheln zu schaffen, macht Plattform-Cache auch Platz für mehr Daten! Wenn der Partitionsgrenzwert überschritten wird, entfernt Salesforce zwischengespeicherte Daten auf Grundlage eines LRU-Algorithmus (Least Recently Used, dt. am seltensten verwendet). Die Cache-Entfernung findet statt, bis die Auslastung auf weniger als oder gleich 100 % der Kapazität gesunken ist. Wenn Sie den lokalen Cache-Grenzwert überschreiten, können Elemente aus dem lokalen Cache entfernt werden, bevor für die Anforderung ein Commit erfolgt ist.
Aufbewahrungsdauer und Ablauf zwischengespeicherter Daten
Der Zeitraum, in dem Daten im Cache aufbewahrt werden, wird als TTL-Wert (Time To Live, ttlsecs) ausgedrückt. Den TTL-Wert geben Sie an, wenn Sie ein Schlüssel-Wert-Paar mithilfe von Apex-Methoden im Cache speichern. Der Sitzungs-Cache bietet für Ihre Daten eine Aufbewahrungsdauer von bis zu 8 Stunden. Der Organisations-Cache bietet für Ihre Daten eine Aufbewahrungsdauer von bis zu 48 Stunden. Der TTL-Wert für den Organisations-Cache ist standardmäßig 24 Stunden.
Der Sitzungs-Cache läuft ab, wenn der angegebene TTL-Wert erreicht ist oder die Sitzung abläuft, je nachdem, was zuerst eintritt. Der Organisations-Cache läuft ab, wenn der angegebene TTL-Wert erreicht ist.
Bewährte Vorgehensweise für den Umgang mit Cache-Fehlzugriffen
Als bewährte Vorgehensweise sollte Ihr Code Fehlerstellen vorwegnehmen und berücksichtigen. Mit anderen Worten, gehen Sie immer davon aus, dass ein Cache-Fehlzugriff auftreten kann. Ein Cache-Fehlzugriff liegt vor, wenn Sie einen Wert für einen Schlüssel aus dem Cache anfordern, der Wert aber nicht gefunden wird. Der Wert, den Ihr get()-Aufruf zurückgibt, ist NULL. Prüfen Sie, ob der get()-Aufruf NULL zurückgibt, und beheben Sie den Fehler. Wenn das Ergebnis beispielsweise NULL ist, rufen Sie den Wert aus der Datenbank oder über einen API-Aufruf ab.
Der folgende Apex-Codeausschnitt zeigt, wie Cache-Fehler behandelt werden, indem überprüft wird, ob der zurückgegebene Wert aus dem Cache nicht NULL ist (if (cachedRate != null)). Wenn der Wert nicht NULL ist, können Sie ihn nutzen und z. B. auf einer Seite anzeigen. Rufen Sie diesen Wert andernfalls aus einer anderen Quelle ab, z. B. über einen API-Aufruf oder aus Salesforce.
Cache.OrgPartition orgPart = Cache.Org.getPartition('local.CurrencyCache'); String cachedRate = (String)orgPart.get('DollarToEuroRate'); // Check the cache value that the get() call returned. if (cachedRate != null) { // Display this exchange rate } else { // We have a cache miss, so fetch the value from the source. // Call an API to get the exchange rate. }
Speichern und Abrufen von Daten im Sitzungs-Cache
Erinnern Sie sich noch an die Aufgaben des Sitzungs-Caches? Genau, er dient zum Speichern von Daten, die an einzelne Benutzersitzungen gebunden sind. Beispielsweise können Sie den Sitzungs-Cache in einer Anwendung verwenden, um die bevorzugte Währung des Benutzers oder dessen benutzerdefinierte Reihenfolge der Navigationsregisterkarten zu speichern. Mit dem Sitzungs-Cache können Sie Cache-Werte in Apex verwalten und zwischengespeicherte Werte mit einer globalen Visualforce-Variablen auslesen.
Bei Verwendung von Apex ist die Verwaltung des Sitzungs-Caches ähnlich der Verwaltung des Organisations-Caches, nur dass die Klassennamen unterschiedlich sind. Nutzen Sie die Klassen Cache.Session und Cache.SessionPartition, um auf die im Sitzungs-Cache gespeicherten Werte zuzugreifen. Um Werte in einer beliebigen Partition zu verwalten, verwenden Sie die Methoden der Cache.Session-Klasse. Wenn Sie Cache-Werte in nur einer Partition verwalten, verwenden Sie stattdessen die Cache.SessionPartition-Methoden. Die Cache.SessionPartition-Methoden sind einfacher zu verwenden als die Cache.Session-Methoden, da Sie den Namespace und das Partitionspräfix nur beim Anlegen des Partitionsobjekts einmal angeben.
Das folgende Apex-Codeausschnitt zeigt, wie der Zugriff auf eine Partition erfolgt, um einen Cache-Wert zu speichern und abzurufen. Die Klasse ruft die Partition namens "CurrencyCache" im lokalen Namespace ab. Ein neuer Wert wird mit dem Schlüssel FavoriteCurrency hinzugefügt. Der Wert des Schlüssels FavoriteCurrency wird abgerufen. Der Schlüssel FavoriteCurrency speichert die bevorzugte Währung des Benutzers, sodass dieser Wert für jeden Benutzer unterschiedlich ist und sich daher gut für den Sitzungs-Cache eignet.
// Get partition Cache.SessionPartition sessionPart = Cache.Session.getPartition('local.CurrencyCache'); // Add cache value to the partition sessionPart.put('FavoriteCurrency', 'JPY'); // Retrieve cache value from the partition String cachedRate = (String)sessionPart.get('FavoriteCurrency');
Zugreifen auf Plattform-Cache mit globalen Visualforce-Variablen
Greifen Sie über die globalen Variablen $Cache.Session oder $Cache.Org von einer Visualforce-Seite aus auf die im Plattform-Cache gespeicherten Werte zu. Mithilfe dieser globalen Variablen können Sie direkt auf Ihrer Visualforce-Seite Werte aus dem Cache auslesen, die mit Apex gespeichert wurden.
Wenn Sie die globale Variable $Cache.Session verwenden, qualifizieren Sie den Schlüsselnamen vollständig mit Namespace und Partitionsnamen. Dieses Beispiel ist eine Ausgabetextkomponente, die einen zwischengespeicherten Wert aus dem Namespace ExPro, der Partition CurrencyCache und dem Schlüssel FavoriteCurrencyRate abruft.
<apex:outputText value="{!$Cache.Session.ExPro.CurrencyCache.FavoriteCurrencyRate}"/>
Anders als bei den Apex-Methoden können Sie das Präfix "namespace.partition" nicht weglassen, um auf die Standardpartition in der Organisation zu verweisen. Wenn kein Namespace für die Organisation definiert ist, verwenden Sie "local", um auf den Namespace der aktuellen Organisation zu verweisen, in der der Code ausgeführt wird.
<apex:outputText value="{!$Cache.Session.local.MyPartition.Key}"/>
Wenn der zwischengespeicherte Wert eine Datenstruktur mit Eigenschaften oder Methoden ist, wie beispielsweise eine Apex-Liste oder benutzerdefinierte Klasse, greifen Sie auf diese Eigenschaften im Ausdruck $Cache.Session mit Punktnotation zu. Zum Beispiel ruft dieses Markup die Apex-Methode List.size() auf, wenn der Wert von numbersList als Liste deklariert ist.
<apex:outputText value="{!$Cache.Session.local.MyPartition.numbersList.size}"/>
In diesem Beispiel wird auf die Eigenschaft "Value" für den Cache-Wert myData zugegriffen, der als benutzerdefinierte Klasse deklariert ist.
<apex:outputText value="{!$Cache.Session.local.MyPartition.myData.value}"/>
Geschützte Cache-Zuteilung für ISV-Anwendungen
Bei Verwendung von Plattform-Cache können ISV-Anwendungen schneller und mit besserer Leistung ausgeführt werden. Als ISV-Entwickler können Sie Cache-Speicherplatz für Ihre Anwendungen garantieren, indem Sie diesen für Ihren eigenen Namespace kaufen. Wenn Ihre Anwendung in einer Abonnentenorganisation installiert ist, wird der Speicherplatz für den Cache Ihrer Anwendung durch die Verwendung des Caches in der Abonnentenorganisation nicht beeinflusst. Nur Apex-Code, der im Namespace Ihrer Anwendung ausgeführt wird, kann auf den Cache Ihres Namespaces zugreifen und diesen nutzen. Kein anderer Code in der Abonnentenorganisation kann diesen Cache nutzen. Sie können Ihre Anwendung mit dem Cache Ihres Namespaces testen und sicher sein, dass die Cache-Zuteilung in jeder Abonnentenorganisation geschützt ist.
Cache-Partitionen werden als Teil des Anwendungspakets an Abonnenten verteilt. Fügen Sie eine oder mehrere Cache-Partitionen für Ihren Namespace als Komponenten Ihrem Paket auf dieselbe Weise wie andere Komponenten hinzu. Cache-Partitionen werden nicht automatisch als abhängige Komponenten hinzugefügt.
Die folgende Abbildung zeigt ein Beispiel von Cache-Kapazität für eine Enterprise Edition-Abonnentenorganisation, in der ein Paket mit gepacktem Cache installiert wurde. Die gesamte Cache-Kapazität des Abonnenten von 30 MB ist auf drei Partitionen aufgeteilt, die aus Kombinationen von Sitzungs- und Organisations-Cache bestehen. Die gepackte Cache-Kapazität stammt aus dem installierten Paket in der Organisation des Abonnenten und enthält zwei Partitionen. Der gepackte Cache besteht aus 20 MB Cache, den der ISV gekauft hat. (Denken Sie daran, dass nur der Apex-Code aus dem Paket auf den gepackten Cache zugreifen kann und der Code in der Organisation des Abonnenten diesen Cache nicht nutzen kann.)
Kaufen Sie Ihren Namespace-Cache über die Channel Order App. Sie können Cache in 10-MB-Blöcken erwerben. Um festzustellen, wie viel Cache-Speicherplatz Ihre Anwendungen brauchen, testen Sie Ihre Anwendungen mit Ihren Cache-Partitionen. Verwenden Sie Test-Cache, um die Kapazität des Caches in Ihrer Organisation zu erhöhen. Wie bereits im ersten Kapitel erwähnt, erhalten bestimmte Editionen von Abonnentenorganisationen standardmäßig eine Cache-Zuteilung. Für Ihre Developer Edition-Organisation, in der Sie Anwendungen entwickeln, können Sie 10 MB Test-Cache beantragen. Sie können beantragen, die Größe des Test-Caches für Ihre Organisation zu erhöhen, indem Sie sich an Salesforce wenden. Durch Experimentieren mit verschiedenen Cache-Größen haben Sie eine bessere Vorstellung davon, wie viel Cache Sie für Ihren eigenen Namespace erwerben sollten.
Nachdem Sie nun gesehen haben, wie Werte in Plattform-Cache abgerufen und gespeichert werden, probieren Sie es selbst aus! Bewältigen Sie die folgende Aufgabe, um Ihr Wissen zu testen.
Ressourcen
Ressourcen im Apex Developer Guide:
Ressourcen in der Salesforce-Hilfe: Zwischenspeichern von Lightning-Plattformdaten