使用组织和会话缓存

学习目标

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

  • 创建一个分区。
  • 在组织和会话缓存中存储和检索值。
  • 描述缓存中的值的持续时间。
  • 处理缓存未命中。
  • 从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中获取和存储值,请自行尝试!完成以下挑战以测试您的知识。