本页面适用于 Apigee 和 Apigee 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¶m2=value2
<CacheKey>
元素可以将这些值与如下配置合并:
<CacheKey> <KeyFragment ref="request.queryparam.param1" /> <KeyFragment ref="request.queryparam.param2" /> <CacheKey>
在运行时,缓存键将包含串联的参数值,如下所示:
prefix_part__value1__value2
您不需要指定多个不同的查询参数,而是可以使用 request.querystring
变量,该变量直接插入整个参数字符串,将其作为缓存键的一部分。请注意,尽管此方法会考虑所有参数,但如果参数的顺序在一个请求与下一个请求之间有所不同,那么键也会不同。换句话说,param1=value1¶m2=value2
和 param2=value2¶m1=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 |