一、Platform Cache 入门
本单元介绍 Platform Cache 的基础概念:什么是缓存、为什么 Platform Cache 对 Salesforce 应用重要、两种缓存类型(org 缓存和 session 缓存)、何时使用缓存,以及如何用分区分配缓存空间。
学完本单元,你将能够:描述 Platform Cache 及其用途;列出两种缓存类型并各举例;描述分区及其用法。注意:本模块面向 Salesforce Classic(而非 Lightning Experience)设计。
什么是缓存?什么是 Platform Cache?
缓存(cache)是临时存储。在计算机世界里,缓存是数据库中频繁访问数据的临时存储。想象你是一只花栗鼠:晚上 5 点你饿了,会用颊囊里存着的坚果(缓存),还是会跑回森林去树上摘(数据库)?访问颊囊里的临时食物,晚餐离你更近、更快吃到,也更高效。数据缓存对人也有类似的好处。
Platform Cache 是一个内存层,存储 Salesforce 的 session 和 org 数据供后续访问。使用 Platform Cache 后,应用把可复用的数据存在内存里,运行更快——应用能快速访问这些数据,不必在后续事务中重复计算、重复请求数据库。简单说,把 Platform Cache 想象成云应用的 RAM。
开始前先申请试用:默认 Developer org 的缓存容量是 0 MB。到 Setup 的 Quick Find 输入 cache,点击 Platform Cache,再点击 Request Trial Capacity(可申请 10 MB 试用)。批准即时生效,邮件几分钟内到达。即使没有试用,缓存操作仍可执行,只是存储被绕过、取值返回 null(缓存未命中)。
何时使用 Platform Cache(静态数据与复杂计算)
几乎在任何反复访问相同数据的地方都可以用 Platform Cache。缓存数据能提升应用性能,比反复执行 SOQL 查询、多次 API 调用或重复计算复杂公式更快。
最适合缓存的数据具备三个特征:在 session 内复用、或跨所有用户和请求复用;静态(不快速变化);计算或检索成本高。
存储不常变化的数据:这类数据最初通过第三方 API 调用或本地 SOQL 查询获取,如果值不必时刻高度准确,就适合缓存。例如:公交时刻表、公司班车时刻表、所有用户都看到的标签页标题、应用每页都出现的静态导航栏、想在 session 中保留的用户购物车、每日汇率快照(汇率一天内会波动)。
存储复杂计算的结果:复杂计算或长查询的结果很适合缓存。例如:过去一周的总销售额、公司员工累计志愿时长、销售排行榜。
不是每个用例都适合缓存——变化频繁、实时性要求高的数据(如股票报价)就不是好候选。异步 Apex 访问的数据也不能存进基于用户 session 的缓存。
缓存分配与两种类型
Platform Cache 面向 Enterprise Edition 及以上版本,不同版本默认缓存空间不同:Enterprise Edition 默认 10 MB、Unlimited Edition 30 MB、Performance Edition 30 MB。Professional Edition 客户不可用(可先申请试用再购买)。购买额外缓存前,可申请试用缓存(批准后 Developer Edition 获得 10 MB,其他版本 30 MB)。
Platform Cache 有两种类型:
- Org 缓存(org cache):存储 org 内任何人都能用的全局数据,跨 session、请求、用户和配置文件访问。例如,根据联系人的位置缓存并展示天气数据,或缓存每日汇率快照供应用使用。
- Session 缓存(session cache):存储单个用户的数据,与该用户的 session 绑定,session 最长 8 小时。例如,计算用户当天要拜访的所有客户与其位置的距离,把位置和距离存进 session 缓存,用户再次获取时无需重算;或让用户自定义导航标签顺序并在访问其他页面时复用。
判断标准:这份数据是给所有用户(用 org 缓存),还是只给一个用户(用 session 缓存)?
性能提升与缓存分区
从缓存取数据远比通过 API 调用快。对比 SOQL 与缓存,缓存也远快于 SOQL 查询——在单事务检索中,缓存比 SOQL 快两倍以上;多事务检索时差距更大(样本测试中缓存比 API 调用快数百倍)。
分区(partition)让你分配缓存空间,平衡各应用之间的使用与性能。把数据缓存到指定分区,可确保缓存空间不被其他应用或不重要的数据覆盖。使用 org 缓存空间前,必须先创建分区来定义每个应用的容量。每个分区的容量拆分为 org 缓存和 session 缓存两部分,分配值可为 0、5 MB 或更大(整数),分区(含 org 和 session)最小 5 MB。所有分区(含默认分区)之和等于 Platform Cache 总分配。
例如,org 总共 10 MB,可创建一个 5 MB 分区(5 MB session + 0 MB org),或一个 10 MB 分区(5 MB org + 5 MB session)。
默认分区:你可把任意一个分区设为默认分区(只能有一个),默认分区让你用简写语法执行缓存操作,无需用命名空间和分区名限定键名。例如用 Cache.Org.put('key', 0) 代替 Cache.Org.put('namespace.partition.key', 0)。
二、使用 Org 缓存与 Session 缓存
本单元动手实践:创建分区、学习缓存键名格式、用 Apex 在 org 与 session 缓存中存储和检索数据,理解缓存值的存活时间、如何优雅处理缓存未命中,以及从 Visualforce 页面读取缓存。
学完本单元,你将能够:创建分区;在 org 和 session 缓存中存储与检索值;描述缓存值存活多久;处理缓存未命中;从 Visualforce 页面读取 session 缓存。
创建分区与缓存键名格式
使用 Platform Cache 前,先设置至少一个分区(这是唯一的界面操作,其余都在 Apex 中完成)。创建步骤:1) Setup 的 Quick Find 输入 Platform Cache 并选择;2) 点击 New Platform Cache Partition;3) 给分区命名(如应用名);4) 勾选 Default Partition;5) 输入 session 缓存和 org 缓存容量(本例都填 0 以测试缓存未命中),点击 Save。当不分配空间时,缓存未命中率 100%,get() 返回 null,可用于测试缓存未命中处理。
缓存键名格式为 Namespace.Partition.Key:Namespace 是应用运行所在 org 的命名空间(也可用特殊名 "local" 指代当前 org);Partition 是分区名(如 CurrencyCache);Key 是存储值时用的键名(唯一标识缓存值)。例如存储美元兑欧元汇率,键名 DollarToEuroRate,完整键名为 local.CurrencyCache.DollarToEuroRate。使用默认分区时,可省略命名空间和分区名,只用键名。
在 Org 缓存中存储与检索数据(缓存会永久存在吗?)
设置好分区后,切换到 Apex 管理缓存。org 缓存存储 org 内任何人都可用的数据,可用 Cache.Org 类方法,或 Cache.OrgPartition 类引用特定分区再调用方法。若只管理一个分区,用 Cache.OrgPartition 更简单——只在创建分区对象时指定一次命名空间和分区前缀。例如获取 local 命名空间的 CurrencyCache 分区,用键 DollarToEuroRate 存入当日汇率,再取值。
缓存值会永久存在吗?不会。缓存是临时空间,可能已过期,也可能被逐出(evict)——就像花栗鼠清空颊囊腾地方装更多坚果,Platform Cache 也会清理空间。当分区超出限制时,Salesforce 按最近最少使用(LRU)算法逐出数据,直到使用量降到 100% 容量以内。
存活时间(ttlsecs):session 缓存最长 8 小时,org 缓存最长 48 小时(默认 24 小时)。session 缓存在指定 ttl 或用户 session 到期时过期(先到者为准);org 缓存在指定 ttl 到期时过期。
处理缓存未命中的最佳实践:始终假设缓存未命中会发生。缓存未命中是指请求某键的值但缓存中找不到,get() 返回 null。检查 get() 结果是否为 null 并妥善处理——若为 null,就从数据库或 API 调用获取值。
Session 缓存、Visualforce 访问与受保护缓存
Session 缓存存储与单个用户 session 绑定的数据,如用户偏好的货币或自定义导航标签顺序。在 Apex 中管理 session 缓存与管理 org 缓存类似,只是类名不同:用 Cache.Session 和 Cache.SessionPartition 类。只管理一个分区时用 Cache.SessionPartition 更简单。
用 Visualforce 全局变量访问缓存:通过 $Cache.Session 或 $Cache.Org 全局变量,可直接在 Visualforce 页面读取用 Apex 存入的缓存值,简单读取无需 Apex。使用全局变量时须用命名空间和分区名完整限定键名(如 $Cache.Org.ExPro.CurrencyCache.FavoriteCurrencyRate);若缓存值是 List 或自定义类等有属性/方法的数据结构,用点号访问(如 .size())。
ISV 应用的受保护缓存分配:ISV 开发者可为自己的命名空间购买缓存空间,保证应用装进订阅者 org 时,其缓存空间不受订阅者 org 缓存使用情况影响。只有从应用命名空间运行的 Apex 代码能访问该命名空间的缓存。缓存分区作为包的组件分发,须为非默认分区。订阅者需 Enterprise/Unlimited Edition 或已购买 Platform Cache。
例如 Enterprise Edition 订阅者总容量 30 MB,其中包缓存 20 MB(ISV 购买)含两个分区,与订阅者自己的分区完全隔离。
三、示例应用与缓存诊断
本单元走读一个完整的示例应用——由 Platform Cache 支撑的汇率 Visualforce 页面。你将探索存储和刷新缓存数据的 Apex 控制器模式,学习该缓存什么、用什么数据结构,以及如何诊断缓存使用。
学完本单元,你将能够:解释缓存存储与刷新的模式;决定缓存值用哪种数据结构;诊断缓存使用。
示例应用演练与 Apex 控制器
示例应用演示用 org 缓存存储和检索汇率。汇率一天内会波动,所以这个应用不返回实时汇率,只提供每日快照——正因为我们只关心每日值而非实时精确值,缓存汇率是很好的选择。
应用基于一个 Visualforce 页面和一个 Apex 控制器。首次访问时,汇率通过对外部 Web 服务的 API 调用获取,解析后的 JSON 存入 Salesforce 的 Exchange_Rate__c sObject,并把 sObject 数组存入 org 缓存。后续执行时:先做 SOQL 查询获取第一条 Exchange_Rate__c 记录的 createdDate,判断数据新鲜度——若早于一天则从 API 刷新(同首次执行);若新于一天则从 org 缓存取;若缓存未命中,则从 Exchange_Rate__c sObject 查询并重新存入 org 缓存。
这个 缓存 → 未命中 → 数据库 → 重新填充缓存 的模式,是任何应用中 Platform Cache 的标准模式。
缓存管理最佳实践与诊断
缓存管理最佳实践:把管理缓存的所有逻辑集中在一个方法里,这样缓存只在应用的一个地方被操作,降低访问无效缓存(未命中)或意外覆盖缓存值的风险。不依赖外部数据的应用只需一个 getCachedRates() 方法即可,逻辑更简单。
决定缓存什么数据结构:示例把 sObject 数组存入缓存。存更小的数据(如字段值而非整个 sObject)可减少缓存占用,但每个键存更少数据可能需要复杂逻辑重建数据和 sObject、消耗更多处理时间。一个键存 sObject 数组,比把单个 sObject 存进多个键占用更少缓存空间;缓存更小的项而非列表会因序列化和缓存提交开销而降低性能。选择取决于应用如何用这些数据——为便于在 Visualforce 页面展示,通常把数据缓存为 sObject 列表(sObject 含系统字段会增加空间,但减少逻辑处理时间、提升性能)。记住:使用缓存的主要目标是减少应用执行时间。
诊断缓存使用(仅 Salesforce Classic 可用):先给用户启用 Cache Diagnostics 权限(Setup → Users → 你的用户名 → Edit → 勾选 Cache Diagnostics → Save),然后 Setup → Platform Cache → 点击要诊断的分区 → 在 session/org 缓存下点 Diagnostics。诊断页显示两个图表:容量与使用情况(显示用量上限)、按内容贡献的环形图(按键显示缓存分布),下方列出每个键对应缓存值的大小与访问次数,管理员可直接用 Delete 按钮删除缓存。
据此判断是否调整:若某缓存值访问次数低且体积大,考虑是否真需要它;若接近容量上限,重新考虑缓存什么或购买更多容量。
延伸学习与总结
恭喜完成 Platform Cache 基础模块!你现在了解了什么是 Platform Cache、如何创建分区并用 org 与 session 缓存存取数据、缓存过期与逐出机制、如何处理缓存未命中,以及如何用诊断页监控缓存使用。
继续学习可参考:Salesforce Developers: Platform Cache、Apex Developer Guide: Cache Class、Salesforce Help: Cache Lightning Platform Data,以及 GitHub 上的 Exchange Rates 示例应用源码。

















