浏览示例应用程序并发现缓存诊断

学习目标

完成本单元后,您将能够:

  • 解释用于存储和刷新缓存数据的模式。
  • 确定用于缓存值的数据结构。
  • 诊断您的缓存使用情况。

示例应用程序演练

让我们看一个示例应用程序,该应用程序演示如何使用组织缓存来存储和检索货币汇率。汇率在一天内波动,因此该示例应用程序不会返回实时汇率。该应用程序只提供汇率的每日快照。因为我们对准确的实时价值不感兴趣,而只对日常价值感兴趣,因此缓存货币汇率是一个不错的选择。当重复检索汇率时,从缓存中获取汇率会节省大量时间并提高应用程序的性能。

示例应用程序概述

我们将我们的汇率样本申请基于Visualforce页面和Apex控制器,该控制器包含获取汇率的逻辑。第一次访问此页面时,速率是通过对外部Web服务的API调用获得的。只要费率低于一天,此页面的后续执行将从缓存中返回费率。对于每种汇率,此页面显示基础货币,转换的目标货币和转换率。出于说明目的,返回一小组货币。

Visualforce页面显示货币汇率

此示例是Visualforce页面的标记。此页面与ExchangeRates Apex控制器。

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

样品Apex控制器

我们的样品Apex控制器可以完成繁重的工作。它获取汇率,将它们存储在Salesforce和缓存中,并从缓存中检索汇率。以下是样本控制器执行的操作细分,后跟源代码。

第一次运行样本时,会发生以下操作。

  • 汇率是从对外部端点的API调用获得的。
  • 从API调用返回的结果(以JSON格式)将被解析并保存在Salesforce中的Exchange_Rate__c sObjects中。
  • 该 getCachedRates() method将Exchange_Rate__c sObjects数组存储在org缓存中。

在随后的样本执行中:

  • 该示例检查存储数据的新鲜程度。为此,它执行SOQL查询以获取第一个返回的Exchange_Rate__c记录的createdDate值。
  • 如果日期早于一天,则从API调用获得汇率,与第一次执行时一样。
  • 如果日期早于一天,则费率将从组织缓存中获取。如果存在高速缓存未命中,则从Exchange_Rate__c sObject查询速率并将其存储在组织高速缓存中。
注意

注意

Apex控制器使用一个名为的辅助Apex类 RateLib,这里没有显示。此帮助程序类包含用于对传输速率服务进行传出API调用,从API调用解析JSON结果以及存储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;
    }
}

要下载Exchange Rate示例的来源并在Developer org中使用它,请参阅参考资料部分。

缓存管理的最佳实践

缓存存储的模式

该 ExchangeRatesApex类包含封装初始化和刷新缓存的逻辑的方法。如果数据陈旧或未找到,则在里面()method通过API调用检索新的汇率,然后将它们存储在Salesforce中。该getCachedRates()方法在内部管理缓存。如果未找到缓存值,则此方法从Salesforce检索一组速率并将其存储在缓存中。

由于我们的应用程序使用外部数据,因此它通过API调用从Web服务获取数据。它还将数据存储为Salesforce记录,作为刷新缓存的备份。不使用外部数据的应用程序使用SOQL检索Salesforce记录并对其进行缓存。在这种情况下,缓存管理过程更简单,缓存方法实现更短。例如,如果您的应用只使用SOQL中的本地数据,则不需要在里面() 方法,但只有 getCachedRates() 方法。

我们建议您在一种方法中包含用于管理缓存的所有逻辑。这样,缓存仅在应用程序的一个位置进行操作。高速缓存的集中管理减少了访问无效高速缓存(高速缓存未命中)或意外覆盖高速缓存值的错误的可能性。

决定缓存什么

此示例将一个sObjects数组存储在缓存中。这种方法是存储数据结构的最佳选择吗?你做出的每一个选择都有权衡。存储较小的数据片段(如字段值而不是整个sObject)可以减少缓存使用量。但是,如果在每个键中存储的数据较少,则可能需要复杂的逻辑来重建数据和sObject,这需要更多的处理时间。并且存储在一个键中的sObject数组使用的缓存空间少于存储在各个键中的各个sObject的总大小。由于序列化和缓存提交时间的开销,缓存较小的项而不是项列表会降低缓存性能。例如,

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

您可以将各个费率存储为具有自己的缓存键的字段,如下所示。

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

决定缓存哪种数据结构取决于您的应用程序对数据的处理方式。例如,如果应用程序转换相同基础货币的货币,则至少存储每种目标货币的汇率。您可以将每种货币汇率存储为单个键。但是为了更容易在Visualforce页面上显示费率,请将数据缓存为sObject列表。sObjects可以增加存储空间,因为它们包含系统字段,例如创建的日期,但它们减少了逻辑处理时间并提高了应用程序和缓存性能。请记住,在使用缓存时,主要目标是减少应用程序的执行时间。

诊断缓存使用情况

所以,你已经完成了所有这些工作来实现Platform Cache。你怎么知道你是否正在充分利用缓存?有几种方法可以检查性能数据。一种方法是在Setup中查看诊断信息(仅在Salesforce Classic中可用)。

在访问诊断页面之前,请为您的用户启用缓存诊断权限。

  1. 从“设置”中,输入users“ 快速查找”框,然后选择“ 用户”
  2. 单击您的用户名,然后单击“ 编辑”
  3. 选择“ 缓存诊断”,然后单击“ 保存”

接下来,访问分区中特定缓存类型的诊断页面。

  1. 从“设置”中,输入cache“ 快速查找”框,然后选择“ 平台缓存”
  2. 单击要检查其诊断信息的分区。
  3. 在会话缓存或组织缓存下,单击“ 诊断”

如果单击“组织缓存”的“ 诊断”,则会在新选项卡中打开“组织缓存诊断”页面。此页面显示两个图表。第一个图表(组织缓存容量和使用情况)显示您的缓存使用限制。在我们的例子中,我们低于极限0.02%。第二个图表(按内容贡献)是一个圆环图,按键显示缓存分布。

注意

注意

因为我们的示例使用org缓存,所以我们只检查诊断页面中的org缓存。还为使用会话高速缓存的应用程序的会话高速缓存提供了类似的诊断页面。

下图显示了包含四个缓存键的内容分发图表。其中一个缓存键Rate用于我们的汇率样本。该 价格键更采用了比空间的一半。

组织缓存的诊断页面

在图表之后,列出了缓存键的详细信息。此列表提供与密钥对应的每个缓存值的大小以及访问缓存的次数。您可以从此列表中手动删除缓存,作为调用该缓存的替代方法去掉()Apex中的方法。“ 删除”按钮允许管理员在不修改任何代码的情况下管理缓存。

该DollarToEuroRate键使用比少得多的空间 价格的关键。这是可以预料的,因为 DollarToEuroRate只存储一个值,而 Rates存储一组sObjects。

使用诊断页面上的信息确定是否调整缓存使用情况。例如,如果缓存值具有较低的访问计数,表明它很少使用,请考虑它是否真的需要,特别是如果它很大。或者,如果您接近缓存使用限制,请重新考虑缓存内容。您可能希望删除不必要的缓存值或购买更多缓存容量。

恭喜!您已经学习了如何使用Platform Cache来缓存应用程序的数据以便快速检索。您还了解了缓存最佳实践以及如何诊断缓存使用情况。您现在已准备好加入花栗鼠的冒险并缓存宝贵的资源!

使用组织和会话缓存

学习目标

完成本单元后,您将能够:

  • 创建一个分区。
  • 在组织和会话缓存中存储和检索值。
  • 描述缓存中的值的持续时间。
  • 处理缓存未命中。
  • 从Visualforce页面读取会话缓存。

创建分区

注意

注意

还没有缓存试用版吗?此单元需要有效的Platform Cache试用版。使用上一个单元中的说明申请试用。如果您没有缓存试用版,则仍可以执行本机中的步骤,但不会在缓存中找到您的数据。

要使用Platform Cache,首先要设置至少一个分区。设置分区后,您可以使用Platform Cache Apex API添加,访问和删除数据。

每个分区都有一个会话缓存和一个组织缓存段。您可以为每个段分配单独的容量。通常,您为分区分配至少5 MB。对于此示例,我们不分配任何空间以确保您的代码正确处理缓存未命中。当没有分配空间时,缓存未命中率为100%,这意味着在缓存中找不到缓存值,并且得到() 方法返回 空值。考虑使用此技术来测试缓存未命中。我们将在后面的部分介绍如何处理缓存未命中。

首先,让我们从Platform Cache页面创建一个分区(仅在Salesforce Classic中可用)。

  1. 在“设置”中,输入Platform Cache“ 快速查找”框,然后选择“ 平台缓存”
  2. 单击“ 新建平台缓存分区”
  3. 为分区指定名称(例如应用程序的名称)。
  4. 检查默认分区
  5. 输入0会话缓存和0组织缓存,然后单击“ 保存”

缓存密钥名称格式

每个缓存键具有以下格式:

Namespace.Partition.Key

名称空间是运行应用程序的组织的名称空间名称,也可以设置为特殊名称“local”。“本地”名称是指组织的名称空间是否在组织中定义了名称空间。

分区是您创建的分区的名称。在此示例中,它是CurrencyCache。

Key是用于存储值的键的名称。键名唯一地表示您的缓存值。

假设我们想将货币汇率从美元存储到欧元。我们可以创建一个名为DollarToEuroRate的密钥。对于我们刚刚创建的分区,密钥的全名是:

local.CurrencyCache.DollarToEuroRate

例如,此代码段存储了DollarToEuroRate键的组织缓存中的值。

Cache.Org.put('local.CurrencyCache.DollarToEuroRate', '0.91');

我们创建的分区是默认分区,因此您可以省略命名空间和分区名称,只需指定密钥名称即可。

DollarToEuroRate

使用默认分区时,可以将put()调用缩短为以下内容。

Cache.Org.put('DollarToEuroRate', '0.91');

在组织缓存中存储和检索数据

您已完成设置分区,这是您在用户界面中执行的唯一步骤。现在我们将切换到Apex来管理缓存。使用组织缓存来存储组织中任何人都可以使用的数据。要么使用Cache.Org 类方法,或使用 Cache.OrgPartition用于引用特定分区的类。然后调用该分区上的缓存方法。

以下Apex代码段显示了如何使用。访问分区 Cache.OrgPartition用于存储和检索货币兑换应用程序的缓存值的类。它在本地名称空间中获取名为CurrencyCache的分区。使用关键的DollarToEuroRate和今天的货币汇率添加新值 。接下来,从缓存中检索关键DollarToEuroRate的值。

// 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');

如果您只在一个分区中管理缓存值,请使用 Cache.OrgPartition方法。该Cache.OrgPartition 方法比使用起来更容易 Cache.Org 方法,因为在创建分区对象时只指定了一次命名空间和分区前缀。

缓存价值最后一次?

前面的例子假设一切正常,即:

  • 平台缓存已启用,并具有可用空间的分区
  • 缓存中的缓存值
  • 该值已成功存储在缓存中

但在现实生活中,缓存数据并不总能得到保证。平台缓存旨在作为临时空间。例如,缓存可能已过期。即使缓存仍处于活动状态,您的缓存数据也可能会从缓存中逐出。就像花栗鼠清理他们的脸颊以腾出更多橡子的空间一样,Platform Cache也可以清除一些空间以获得更多数据!超出分区限制时,Salesforce会根据最近最少使用(LRU)算法驱逐缓存数据。高速缓存逐出直到使用减少到小于或等于100%容量。此外,如果超出本地缓存限制,则可以在提交请求之前从本地缓存中逐出项目。

缓存数据持续时间和到期时间

数据保存在缓存中的时间称为生存时间值(ttlsecs)。使用Apex方法在缓存中存储键值对时,可以指定生存时间值。对于会话缓存,您的数据最多可在缓存中保存8小时。对于组织缓存,您的数据最多可在缓存中运行48小时。默认情况下,组织缓存的生存时间值为24小时。

会话缓存在达到其指定的生存时间值或用户会话到期时(以先到者为准)到期。组织缓存在达到其指定的生存时间值时到期。

处理缓存未命中的最佳实践

作为最佳实践,您的代码应该预见并容纳故障点。换句话说,始终假设可能发生缓存未命中。缓存未命中是指从缓存中请求密钥值但未找到值的情况。你的价值 得到()call returns为null。检查结果得到()调用null并相应地处理它。例如,如果结果是空值,从数据库或API调用中获取值。

以下Apex代码段显示了如何通过检查缓存中返回的值是否来处理缓存未命中 空值 (if(cachedRate!= null))。如果值不是空值,您可以使用该值,例如,在页面上显示它。否则,从其他源(例如API调用或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.
}

在会话缓存中存储和检索数据

还记得什么会话缓存吗?没错,它存储与各个用户会话相关的数据。例如,您可以在应用程序中使用会话缓存来存储用户喜欢的货币或用户的自定义导航选项卡顺序。使用会话缓存,您可以使用Visualforce全局变量管理Apex中的缓存值并读取缓存值。

使用Apex时,管理会话缓存与管理组织缓存的方式类似,但类名不同。使用Cache.Session 和 Cache.SessionPartition用于访问存储在会话高速缓存中的值的类。要管理任何分区中的值,请使用中的方法Cache.Session 类。如果您只在一个分区中管理缓存值,请使用Cache.SessionPartition方法而不是。该Cache.SessionPartition 方法比使用起来更容易 Cache.Session 方法,因为在创建分区对象时只指定了一次命名空间和分区前缀。

以下的Apex代码片段显示了如何访问分区以存储和检索缓存值。它在本地名称空间中获取名为CurrencyCache的分区。使用关键的FavoriteCurrency添加新值。检索FavoriteCurrency密钥的值 。该 FavoriteCurrency密钥存储用户的喜爱货币,所以这个值是为每个用户,因此一个很好的候选人会话缓存不同。

// 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');

使用Visualforce全局变量访问平台缓存

通过使用,从Visualforce页面访问存储在平台缓存中的缓存值 $ Cache.Session 要么 $ Cache.Org全局变量。通过使用这些全局变量,您可以直接从Visualforce页面读取与Apex一起存储的缓存值。

注意

注意

以下示例显示如何使用。访问会话高速缓存 $ Cache.Session全局变量。除了使用之外,等效的org缓存示例是相同的$ Cache.Org 而是全局变量。

使用时 $ Cache.Session全局变量,使用命名空间和分区名称完全限定密钥名称。此示例是一个输出文本组件,用于从命名空间中检索缓存的值艾博, 划分 CurrencyCache和关键 FavoriteCurrencyRate。

<apex:outputText value="{!$Cache.Session.ExPro.CurrencyCache.FavoriteCurrencyRate}"/>

与Apex方法不同,您不能省略 namespace.partition前缀以引用组织中的默认分区。如果没有为组织定义名称空间,请使用本地 引用运行代码的当前组织的命名空间。

<apex:outputText value="{!$Cache.Session.local.MyPartition.Key}"/>

如果缓存的值是具有属性或方法的数据结构,如Apex List或自定义类,则访问这些属性 $ Cache.Session表达式使用点表示法。例如,此标记调用则为list.size() 如果是Apex方法的值 numbersList 被声明为List。

<apex:outputText value="{!$Cache.Session.local.MyPartition.numbersList.size}"/>

此示例访问on上的value属性 MYDATA的 声明为自定义类的缓存值。

<apex:outputText value="{!$Cache.Session.local.MyPartition.myData.value}"/>

ISV应用程序的受保护缓存分配

通过使用平台缓存,ISV应用程序运行速度更快,性能更佳。如果您是ISV开发人员,则可以通过为自己的命名空间购买缓存空间来保证应用程序的缓存空间。这样,当您的应用安装在订阅者组织中时,应用缓存的空间不会受到订阅者组织中缓存使用的影响。只有从应用程序命名空间运行的Apex代码才能访问和使用命名空间的缓存。订阅者组织中没有其他代码可以使用此缓存。您可以根据命名空间的缓存测试您的应用程序,并确保缓存分配将在每个订阅者组织中受到保护。

缓存分区作为应用程序包的一部分分发给订阅者。将命名空间的一个或多个缓存分区作为组件添加到包中,方法与添加其他组件相同。缓存分区不会自动添加为依赖组件。

包含缓存分区的包组件列表
注意

注意

请参阅以下有关打包分区的信息

  • 您添加到程序包的分区必须是非默认分区。
  • 当订户安装您的软件包时,缓存分区将安装在其组织中,使您的应用程序可以访问您的命名空间的已安装缓存分区。
  • 订阅者必须拥有Enterprise Edition或Unlimited Edition组织,或者必须购买Platform Cache。

下图显示了使用打包缓存安装软件包的Enterprise Edition订户组织的示例缓存容量。订户的总缓存容量为30 MB,分为三个分区,包括会话和组织缓存的组合。打包的缓存容量来自订户组织中已安装的包,并包含两个分区。打包的缓存由ISV购买的20 MB缓存组成。(请记住,只有包中的Apex代码才能访问打包的缓存,订阅者组织中的代码无法使用此缓存。)

打包分区和组织分区的缓存容量是分开的

从Channel Order App购买命名空间缓存。您可以购买10 MB块的缓存。要确定应用程序需要多少缓存空间,请使用缓存分区测试应用程序。使用试用缓存来增加组织中缓存的容量。正如我们在第一个单元中提到的,默认情况下,某些版本的订户组织会获得缓存分配。对于开发应用程序的Developer Edition组织,您可以请求10 MB的试用缓存。您可以通过联系Salesforce请求增加为您的组织提供的试用缓存数量。通过尝试不同的缓存大小,您可以更好地了解为自己的命名空间购买多少缓存。

现在您已经了解了如何在Platform Cache中获取和存储值,请自行尝试!完成以下挑战以测试您的知识。

开始使用Platform Cache

学习目标

完成本单元后,您将能够:

  • 描述什么是平台缓存以及它的用途。
  • 列出两种类型的平台缓存并给出每种缓存的示例。
  • 描述分区以及如何使用它们。

什么是缓存?

缓存是临时存储。在计算机世界中,缓存是来自数据库的频繁访问数据的临时存储。这是一个类比。假设你是一只寻找坚果和橡子的花栗鼠。现在是5点,你准备好吃了。你打算使用存放在你脸颊上的坚果和橡子(缓存),还是你要回到森林里从树上收集更多(数据库)?如果您在脸颊上访问食物的临时缓存,您的晚餐会更接近,您可以更快地吃到它!此外,您可以更有效地实现目标。数据缓存具有类似的优点,但对于人而言,不是花栗鼠。

一种花栗鼠,脸颊上有坚果

什么是平台缓存?

Platform Cache是​​一个存储层,用于存储Salesforce会话和组织数据以供以后访问。使用Platform Cache时,您的应用程序可以更快地运行,因为它们将可重用数据存储在内存中。应用程序可以快速访问此数据; 他们不需要在后续事务中复制计算和对数据库的请求。简而言之,将Platform Cache视为云应用程序的RAM。

使用Platform Cache,您还可以分配缓存空间,以便某些应用程序或操作不会窃取其他人的容量。您使用分区来分配空间。我们稍后会进入分区。

在我们继续前进之前

让我们暂停一下,请求试用平台缓存。默认情况下,您的Developer org具有0 MB缓存容量。您可以请求10 MB的试用缓存。

要申请试用,请转到开发人员组织中的“设置”。在“ 快速查找”框中,输入cache,然后单击“ 平台缓存”。单击“ 请求试用容量”并等待电子邮件通知您平台缓存试用版处于活动状态。Salesforce立即批准试用请求,但您可能需要几分钟才能收到电子邮件。

请求“平台缓存”页面上的“试用容量”按钮

如果您没有缓存试用版,则仍可以执行缓存操作以了解如何使用缓存。但是,会绕过缓存存储,并且检索的值为空(缓存未命中)。

好的,既然您已经请求了Platform Cache试用版,那么让我们学习更多概念。

我什么时候可以使用平台缓存?

您可以在代码中使用平台缓存,几乎可以在任何地方反复访问相同的数据。使用缓存数据可以提高应用程序的性能,并且比重复执行SOQL查询,进行多个API调用或计算复杂计算更快。

要缓存的最佳数据是:

  • 在整个会话中重用,或在所有用户和请求中重用
  • 静态(不会快速变化)
  • 计算或检索费用昂贵

存储不经常更改的数据

使用缓存来存储不经常更改的静态数据或数据。该数据最初通过来自第三方的API调用或通过SOQL查询在本地检索。如果数据发生更改,请在不必始终高度准确的情况下缓存此数据。

此类静态数据的示例如下:

  • 公共交通时刻表
  • 公司班车时刻表
  • 所有用户都看到的标题页眉
  • 显示在应用的每个页面上的静态导航栏
  • 您希望在会话期间保留的用户购物车
  • 每日汇率快照(汇率在一天内波动)

存储从复杂计算中获得的数据

由复杂计算或长查询产生的值是缓存存储的良好候选者。此类数据的示例如下:

  • 过去一周的总销售额
  • 公司员工整体志愿服务时间总计
  • 最畅销的排名

有关使用Platform Cache的位置的线索,请检查您的代码。例如,您当前是否通过重载Visualforce视图状态来存储应用程序数据?这些存储的值都是Platform Cache的候选者。

并非每个用例都是Platform Cache用例。例如,经常更改且实时更改的数据(例如股票报价)不适合缓存。此外,请确保您熟悉Platform Cache限制。例如,如果您的数据由异步Apex访问,则无法将其存储在基于用户会话的缓存中。

按版本缓存分配

具有Enterprise Edition orgs及更高版本的客户可以使用Platform Cache。以下版本带有一些默认缓存空间,但通常情况下,添加更多缓存可提供更高的性能增强。

  • 企业版(默认为10 MB)
  • 无限版(默认为30 MB)
  • 性能版(默认为30 MB)

试用试用缓存

您可以为您的组织购买额外的缓存。要确定多少额外缓存对您的应用程序有益,您可以请求试用缓存并进行试用。此外,在购买缓存之前请求专业版的试用缓存。在Developer Edition组织中使用试用缓存来使用Platform Cache开发和测试您的应用程序。当您的请求获得批准后,您将获得30 MB的试用缓存空间(Developer Edition为10 MB)。如果您需要更多试用缓存空间,请联系Salesforce。

平台缓存的类型是什么?

平台缓存有两种类型:组织缓存和会话缓存。

组织缓存

组织缓存存储组织中任何人都可以使用的组织范围数据。可以跨会话,请求和组织用户和配置文件访问组织缓存。

例如,可以根据联系人的位置为联系人缓存和显示天气数据。或者可以缓存货币汇率的每日快照以便在应用中使用。

会话缓存

会话缓存存储单个用户的数据,并与该用户的会话相关联。会话的最长寿命为8小时。

例如,假设您的应用计算用户位置与用户希望在同一天访问的所有客户之间的距离。位置和计算的距离可以存储在会话高速缓存中。这样,如果用户想要再次获得该信息,则不需要重新计算距离。或者,您可能拥有一个应用程序,使用户可以自定义导航标签顺序,并在访问应用程序中的其他页面时重复使用该顺序。

使用缓存时性能提升了多少?

您可能想知道使用Platform Cache可以提高应用程序的性能。从缓存中检索数据比通过API调用快得多。将SOQL与缓存检索时间进行比较时,缓存也比SOQL查询快得多。

下图显示了通过API调用和缓存的数据检索时间(以毫秒为单位)。在通过缓存本地获取数据时,很容易注意到巨大的性能提升,尤其是在多个事务中检索数据时。在用于图表的示例中,缓存比API调用快数百倍。在此图中,缓存检索时间仅为几毫秒,但由于用于时间值的比例,因此几乎为零。请注意,此图表是一个示例测试,其他应用的实际数字可能会有所不同。对外部服务进行API调用比从缓存中获取数据(2)更慢(1)。

Graph将API调用的处理时间与缓存进行比较

下一个图表将SOQL与组织和会话缓存检索时间进行比较。如您所见,SOQL比缓存慢。在此示例中,缓存比SOQL快两倍或更多倍,以便在单个事务中进行数据检索。在多个事务中执行检索时,差异甚至更大。(请注意,此图表是一个示例,其他应用的实际数字可能会有所不同。)通过SOQL查询获取数据(1)比从组织和会话缓存中获取数据要慢(2)。

Graph将SOQL查询的处理时间与缓存进行比较

什么是缓存分区?

还记得我们之前提到过使用Platform Cache你可以使用分区分配空间吗?我们现在谈谈分区。分区允许您分配缓存空间以平衡跨应用程序的使用情况和性能。将数据缓存到指定的分区可确保缓存空间不会被其他应用程序或不太重要的数据覆盖。

在组织中使用缓存空间之前,必须创建分区以定义应用程序的容量。每个分区容量在组织缓存和会话缓存之间分解。会话和组织缓存分配可以是零,5 MB或更大,并且必须是整数。分区的最小大小(包括其组织和会话高速缓存分配)为5 MB。例如,假设您的组织总共有10 MB的缓存空间,并且您创建了一个总共5 MB的分区,其中5 MB用于会话缓存,0 MB用于org缓存。或者,您可以创建10 MB空间的分区,其中5 MB用于组织高速缓存,5 MB用于会话高速缓存。所有分区的总和(包括默认分区)等于Platform Cache总分配。

下图显示了缓存容量和分区分配的图表。在这个例子中,我们还没有使用缓存,正如0%缓存使用情况(1)所证明的那样,并且已经使用相等的分配创建了两个分区(2)。

缓存容量图表

默认分区

您可以将任何分区定义为默认分区,但只能有一个默认分区。默认分区使您可以使用简写语法在该分区上执行缓存操作。这意味着在添加键值对时,您不必使用命名空间和分区名称完全限定键名。例如,而不是呼叫Cache.Org.put(’namespace.partition.key’,0); 你可以打电话 Cache.Org.put(’key’,0);

在下一个单元中,您将在安装程序中创建一个分区,以便开始使用Platform Cache!