使用缓存键

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

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

Apigee 使用配置元素的值(<Scope><CacheKey>/<Prefix><CacheKey>/<KeyFragment>)来组成缓存键的值,这是与缓存中的值关联的标识符。缓存键的组合方式与所有缓存政策相同。

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

缓存配置元素 说明
<Scope><CacheKey> / <Prefix> 使用 <Scope><CacheKey> <Prefix> 元素配置要应用于最终缓存键的前缀。<Scope> 枚举预定义值列表。<CacheKey> <Prefix> 元素将使用您自选的固定值替换 <Scope>
<CacheKey>/<KeyFragment> 结合使用一个或多个 <CacheKey> <KeyFragment> 元素,为缓存条目指定唯一标识符。KeyFragment 值可以是静态字面量,也可以根据变量进行设置。

Apigee 使用两部分组成缓存键,即前缀部分和复合片段部分,两者之间由双下划线分隔。

PREFIX_PART__FRAGMENT_PART

前缀部分由 <Scope> 元素或 <CacheKey> <Prefix> 元素(如果存在)决定。片段部分由各 <KeyFragment> 元素中的每个值组成,各值之间使用双下划线连接。

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

使用 <CacheKey>

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

<CacheKey> 元素可以包含一个可选的 <Prefix> 元素以及一个或多个 <KeyFragment> 元素。在运行时,Apigee 会用双下划线将各部分确定的值串联起来,以构成缓存键。

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

<CacheKey>
    <Prefix>myprefix</Prefix>
    <KeyFragment>hello</KeyFragment>
    <KeyFragment>world</KeyFragment>
<CacheKey>

您可以通过引用 <KeyFragment> 元素中的变量,将 Apigee 配置为使用动态组合的缓存键,如下所示:

<KeyFragment ref="variable_name"/>

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

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

请考虑以下配置:

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

如果 request.header.Content-Type 变量的值为 application/json,则会得到缓存键 system1__apiAccessToken__application/json__bar

您可以在 ref 特性中使用平台定义的变量或自定义变量。

源自查询参数的缓存键

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

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

prefix_part__value1__value2

您不需要指定多个不同的查询参数,而是可以使用 request.querystring 变量,该变量直接插入整个参数字符串,将其作为缓存键的一部分。请注意,尽管此方法会考虑所有参数,但如果参数的顺序在一个请求与下一个请求之间有所不同,那么键也会不同。换句话说,param1=value1&param2=value2param2=value2&param1=value1 不会生成相同的缓存键值。

使用 <Scope> 和 <Prefix>

<Scope><CacheKey>/<Prefix> 元素提供了一种将缓存值整理到命名空间中的方法。Apigee 会将根据它们派生的值添加为缓存键的前缀。在缓存键中使用范围或前缀的优势在于,您可以通过调用 InvalidateCache 政策使共用一个前缀的所有值失效。

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

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

mycompany__prod__[FRAGMENT_PART]

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

orgName__envName__apiProxyName__deployedRevisionNumber__nameof(proxyEndpoint|targetEndpoint)__[serializedCacheKey]

以下给出了一些示例。这些示例假设名为“weatherapi”的代理的第 16 版部署在名为“mycompany”的组织和名为“prod”的环境中,proxyEndpoint 名称为“default”,并且缓存政策会连接到 proxyEndpoint 中的流。

配置 结果
<Scope>Global</Scope>
<CacheKey>
  <KeyFragment>hello</KeyFragment>
  <KeyFragment>world</KeyFragment>
<CacheKey>
mycompany__prod__hello__world
<Scope>Exclusive</Scope>
<CacheKey>
    <KeyFragment>hello</KeyFragment>
    <KeyFragment>world</KeyFragment>
<CacheKey>
mycompany__prod__weatherapi__16__default__hello__world
<Scope>Exclusive</Scope>
<CacheKey>
    <Prefix>system1</Prefix>
    <KeyFragment>hello</KeyFragment>
    <KeyFragment>world</KeyFragment>
<CacheKey>
system1__hello__world