使用缓存键

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

使用缓存政策时,您可以通过配置缓存键来确保缓存值键的唯一性。缓存键以及您可以配置的其他值提供了一种可靠的方式,让您能够取出与所放入的数据相同的数据。您可以将缓存键与填充缓存政策LookupCache 政策InvalidateCache 政策响应缓存政策结合使用。

配置元素的值(<CacheKey>/<KeyFragment><Scope><Prefix>)串联在一起,以创建与您放入缓存的值相关联的标识符。您可以使用同一配置检索该值。

使用以下缓存政策配置元素,您可以创建缓存键:

缓存配置元素 说明
<CacheKey> / <KeyFragment> 结合使用 <CacheKey> <KeyFragment> 元素,为缓存条目指定唯一标识符。KeyFragment 值可以是静态字面量,也可以根据变量进行设置。
<Scope><Prefix> 使用 <Scope><Prefix> 元素以进一步改进命名空间缓存键。<Scope> 枚举预定义值列表。<Prefix> 元素将使用您选择的值替换 <Scope>

这些值会采用以下格式串联,其中 <Scope><Prefix> 值与 KeyFragment 值之间用双下划线分隔。多个 KeyFragment 值也用双下划线分隔。

scope | prefix__keyfragment[__keyfragment]

使用响应缓存政策,您可以选择向此缓存键附加响应 Accept 标头中的值。

使用 <CacheKey>

<CacheKey> 元素会配置 Edge 如何为其创建的每个缓存条目创建唯一标识符(键)。当 Edge 检索缓存的值时,它使用缓存键查找正确的值。在 ResponseCache 政策中,一个配置可以同时为缓存和检索定义键。在 RePopulateCache 和 LookupCache 政策中,每个政策必须具有相同的 <CacheKey> 元素,以确保从缓存中检索到的值与放在那里的值相对应。

<CacheKey> 元素可以包含多个 <KeyFragment> 元素。在运行时,<KeyFragment> 元素指定的值通过它们时间的两个下划线串联在一起,以构成缓存键的一部分。

例如,以下配置会创建一个值 hello__world,以供在缓存键中使用:

<CacheKey>
    <KeyFragment>hello</KeyFragment>
    <KeyFragment>world</KeyFragment>
<CacheKey>

您还可以在缓存键中使用变量值,方法是在 <KeyFragment> 元素中引用该变量,如下所示:

<KeyFragment ref="variable_name"/>

例如,要使缓存键值包含请求消息的 Content-Type,您可以按如下方式执行此操作:

<KeyFragment ref="request.header.Content-Type"/>

在以下配置中,request.header.Content-Type 变量的值为 application/json

<CacheKey>
  <KeyFragment>apiAccessToken</KeyFragment>
  <KeyFragment ref="request.header.Content-Type" />
  <KeyFragment>bar</KeyFragment>
</CacheKey>

这会生成以 apiAccessToken__application/json__bar 结尾的缓存键。

如需查看您可以使用的变量列表,请参阅变量参考文档

源自查询参数的缓存键

使用 request.queryparam.<queryparam_name> 和 request.querystring 等变量,您可以配置缓存键,使该键包含请求的查询字符串的一部分。例如,以下网址使用了两个查询参数,即 param1 和 param2,您可以在缓存键中使用它们:

http://myaccount.apigee.net/mydata?param1=value1&param2=value2

<CacheKey> 元素可以将这些值与如下配置合并:

<CacheKey>
    <KeyFragment ref="request.queryparam.param1" />
    <KeyFragment ref="request.queryparam.param2" />
<CacheKey>

在运行时,缓存键将包含串联的参数值,如下所示:

other_key_parts__value1__value2

请注意,当您使用变量从参数中插入值时,这些值将按照 <KeyFragment> 元素顺序提示的顺序串联起来。另请注意,Edge 只会使用您使用 <KeyFragment> 元素明确引用的值。如果请求查询参数列表发生变化,那么在缓存键中不会考虑这些变化。

另一种方式是使用 request.querystring 变量,该变量在缓存键中直接插入整个参数字符串。请注意,尽管此方法会考虑所有参数,但如果参数的顺序在一个请求与下一个请求之间有所不同,那么键也会不同。换句话说,param1=value1&param2=value2param2=value2&param1=value1 不会生成相同的缓存键值。

如需查看您可以使用的变量列表,请参阅变量参考文档

使用 <Scope> 和 <Prefix>

<Scope><Prefix> 元素提供了一种使用命名空间前缀扩增键的方法。它们所表示的值将附加到缓存键中。

默认情况下,使用 <Scope> 元素。这是一个枚举,其值的范围从宽到窄,最窄的值是默认值。除非您指定其他值或指定 <Prefix> 元素值,否则系统将使用此默认值。您可以使用 <Prefix> 元素替换 <Scope> 值,以便为命名空间指定自定义值。

例如,<Scope> 值“Global”(全局)是最宽的范围,表示组织和环境名称。因此,如果您的代理部署在名为“mycompany”的组织和名为“prod”的环境中,则生成的前置值将如下所示:

配置 结果
<Scope>Global</Scope> mycompany__prod__

如果您将全局范围与上面定义的缓存键一起使用,则结果如下所示:

配置 结果
<Scope>Global</Scope>
<CacheKey>
    <KeyFragment>hello</KeyFragment>
    <KeyFragment>world</KeyFragment>
<CacheKey>
mycompany__prod__hello__world

LookupCache 政策中所述,您可以配置范围以增加从全局到独占的专用性。独占范围是最具体的范围,因此表示给定缓存中命名空间冲突的风险最低。每个具有独占范围的缓存条目的前缀都采用以下格式:

orgName__envName__apiProxyName__deployedRevisionNumber__proxy|TargetName__[serializedCacheKey]

例如,使用 <Scope> 的独占值创建的缓存键如下所示:

apifactory__test__weatherapi__16__default__apiAccessToken