本頁適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
這項政策會快取後端資源中的資料,減少對資源的要求數量。當應用程式向相同 URI 提出要求時,您可以使用這項政策傳回快取的回應,而非將這些要求轉送至後端伺服器。ResponseCache 政策可減少延遲時間和網路流量,進而提升 API 效能。
這項政策是可擴充的政策,視您的 Apigee 授權而定,使用這項政策可能會產生費用或使用量影響。如要瞭解政策類型和使用相關性,請參閱「政策類型」。
當 API 使用的後端資料只會定期更新時,ResponseCache 最有可能會派上用場。舉例來說,假設您有一個 API,只會每十分鐘更新一次天氣報告資料。您可以使用 ResponseCache 在重新整理之間傳回快取的回應,藉此減少傳送至後端的要求數量。這也能減少網路中繼次數。
如需一般用途的短期快取,請考慮使用 PopulateCache 政策。 這項政策會與 LookupCache 政策 (用於讀取快取項目) 和 InvalidateCache 政策 (用於讓項目失效) 搭配使用。
請觀看以下影片,瞭解「回應快取」政策。
範例
10 分鐘快取
假設您有下列網址的 API:
http://{org_name}-test.apigee.net/weather/forecastrss?w=23424778
您使用查詢參數 w
做為快取金鑰。每次收到要求時,Apigee 都會檢查查詢參數 w
的值。如果快取中存在有效 (即未過期) 的回應,系統會將快取的回應訊息傳回給要求的用戶端。
假設您已將 ResponseCache 政策設定為以下內容。
<ResponseCache name="ResponseCache"> <CacheKey> <KeyFragment ref="request.queryparam.w" /> </CacheKey> <ExpirySettings> <TimeoutInSeconds>600</TimeoutInSeconds> </ExpirySettings> </ResponseCache>
API Proxy 第一次收到下列網址的要求訊息時,回應會快取。在 10 分鐘內提出第二次要求時,系統會執行快取查詢,將快取回應傳回至應用程式,但不會將要求轉送至後端服務。
http://{org_name}-test.apigee.net/weather/forecastrss?w=23424778
略過快取查詢
以下範例說明如何略過快取查詢,並重新整理快取。如要瞭解如何使用 SkipCacheLookup,請參閱 這部影片。
選用的 SkipCacheLookup 條件 (如有設定) 會在要求路徑中評估。如果條件評估為 true,則會略過快取查詢,並重新整理快取。
條件快取重新整理的常見用途,是定義特定 HTTP 標頭的條件,讓條件評估為 true。您可以設定使用指令碼的用戶端應用程式,定期提交含有適當 HTTP 標頭的要求,明確地導致回應快取重新整理。
舉例來說,假設您呼叫下列網址的 API:
'http://{org_name}-test.apigee.net/weather/forecastrss?w=23424778' -H "bypass-cache:true"
假設在該 Proxy 上設定了下列 ResponseCache 政策。請注意,bypass-cache 條件已設為 true。
<ResponseCache name="ResponseCache"> <CacheKey> <KeyFragment ref="request.queryparam.w" /> </CacheKey> <!-- Explicitly refresh the cached response --> <SkipCacheLookup>request.header.bypass-cache = "true"</SkipCacheLookup> <ExpirySettings> <TimeoutInSeconds>600</TimeoutInSeconds> </ExpirySettings> </ResponseCache>
如要進一步瞭解條件,請參閱「流程變數和條件」。
元素參照
元素參照會說明政策的元素和屬性。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ResponseCache async="false" continueOnError="false" enabled="true" name="Response-Cache-1"> <DisplayName>Response Cache 1</DisplayName> <Properties/> <CacheKey> <Prefix/> <KeyFragment ref="request.uri" /> </CacheKey> <Scope>Exclusive</Scope> <ExpirySettings> <ExpiryDate/> <TimeOfDay/> <TimeoutInSeconds ref="flow.variable.here">300</TimeoutInSeconds> </ExpirySettings> <CacheResource>cache_to_use</CacheResource> <CacheLookupTimeoutInSeconds/> <ExcludeErrorResponse/> <SkipCacheLookup/> <SkipCachePopulation/> <UseAcceptHeader/> <UseResponseCacheHeaders/> </ResponseCache>
<ResponseCache> 屬性
<ResponseCache async="false" continueOnError="false" enabled="true" name="Response-Cache-1">
下表說明所有政策父項元素的共同屬性:
屬性 | 說明 | 預設 | 存在必要性 |
---|---|---|---|
name |
政策的內部名稱。 您可以選擇使用 |
不適用 | 必填 |
continueOnError |
將其設為 將其設為 |
false | 選用 |
enabled |
設為 設為 |
是 | 選用 |
async |
此屬性已淘汰。 |
false | 已淘汰 |
<DisplayName> 元素
除了 name
屬性之外,您也可以在管理 UI 代理程式編輯器中使用不同的自然語言名稱標示政策。
<DisplayName>Policy Display Name</DisplayName>
預設 |
不適用 如果省略這個元素,系統會使用政策的 |
---|---|
存在必要性 | 選用 |
類型 | 字串 |
<CacheKey> 元素
設定快取中儲存的資料片段的專屬指標。
快取鍵的大小上限為 2 KB。
<CacheKey> <Prefix>string</Prefix> <KeyFragment ref="variable_name" /> <KeyFragment>literal_string</KeyFragment> </CacheKey>
預設值: |
不適用 |
外觀狀態: |
必填 |
類型: |
不適用 |
<CacheKey>
會建構快取中儲存的每個資料的名稱。通常會使用實體標頭或查詢參數的值來設定鍵。在這種情況下,您可以讓元素的 ref 屬性指定含有鍵值的變數。
在執行階段,<KeyFragment>
值會在開頭加上 <Scope>
元素值或 <Prefix>
值。舉例來說,以下結果會產生 UserToken__apiAccessToken__
<value_of_client_id> 的快取鍵:
<CacheKey> <Prefix>UserToken</Prefix> <KeyFragment>apiAccessToken</KeyFragment> <KeyFragment ref="request.queryparam.client_id" /> </CacheKey>
您可以將 <CacheKey>
元素與 <Prefix>
和 <Scope>
搭配使用。詳情請參閱「使用快取鍵」。
<CacheLookupTimeoutInSeconds> 元素
指定快取查詢失敗後,系統會將其視為快取遺漏的秒數。如果發生這種情況,流程會沿著快取遺漏路徑恢復。
<CacheLookupTimeoutInSeconds>30</CacheLookupTimeoutInSeconds>
預設值: |
30 |
外觀狀態: |
選用 |
類型: |
整數 |
<CacheResource> 元素
指定訊息應儲存在哪個快取中。如要使用內含的共用快取,請省略這個元素。如果您想透過管理方式清除快取記憶體中的項目,請指定 CacheResource
名稱。詳情請參閱「Caches API」。
<CacheResource>cache_to_use</CacheResource>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
<CacheKey>/<KeyFragment> 元素
指定應納入快取索引鍵的值,建立命名空間,以便將要求與快取的回應配對。
<KeyFragment ref="variable_name"/> <KeyFragment>literal_string</KeyFragment>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
不適用 |
這可以是鍵 (您提供的靜態名稱) 或值 (參照變數所設定的動態項目)。所有指定的片段 (加上前置字串) 會串連在一起,以建立快取索引鍵。
<KeyFragment>apiAccessToken</KeyFragment> <KeyFragment ref="request.queryparam.client_id" />
您可以將 <KeyFragment>
元素與 <Prefix>
和 <Scope>
搭配使用。詳情請參閱「使用快取鍵」。
屬性
屬性 | 類型 | 預設 | 必填 | 說明 |
---|---|---|---|---|
ref | 字串 | 否 |
取得值的變數。如果此元素包含文字值,則不應使用此屬性。 |
<CacheKey>/<Prefix> 元素
指定要用來做為快取鍵前置字串的值。
<Prefix>prefix_string</Prefix>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
如要指定您自己的值,而非 <Scope>
列舉值,請使用這個值,而非 <Scope>
。如果已定義,<Prefix>
會在寫入快取的項目前方加上快取鍵值。<Prefix>
元素值會覆寫 <Scope>
元素值。
您可以將 <Prefix>
元素與 <CacheKey>
和 <Scope>
搭配使用。詳情請參閱「使用快取鍵」。
<ExcludeErrorResponse> 元素
這項政策可快取含有任何狀態碼的 HTTP 回應。也就是說,成功和錯誤回應 (包括 2xx 和 3xx 狀態碼) 皆可快取。
將這個元素設為 true
(預設值),即可排除錯誤回應。如果不想排除含有 HTTP 錯誤狀態碼的快取目標回應,請將其設為 false
。
如要瞭解這個元素在哪些回應快取模式中很實用,請參閱反模式簡介。
<ExcludeErrorResponse>true</ExcludeErrorResponse>
預設值: |
是 |
外觀狀態: |
選用 |
類型: |
布林值 |
<ExpirySettings> 元素
指定快取項目的到期時間。如果存在,<TimeoutInSeconds>
會覆寫 <TimeOfDay>
和 <ExpiryDate>
。
<ExpirySettings> <TimeOfDay ref="time_variable">expiration_time</TimeOfDay> <TimeoutInSeconds ref="duration_variable">seconds_until_expiration</TimeoutInSeconds> <ExpiryDate ref="date_variable">expiration_date</ExpiryDate> </ExpirySettings>
預設值: |
不適用 |
外觀狀態: |
必填 |
類型: |
不適用 |
<ExpirySettings>/<ExpiryDate> 元素
指定快取項目的到期日。請使用表單 mm-dd-yyyy
。如有此元素,其同層級元素 <TimeoutInSeconds>
會覆寫 <ExpiryDate>
。
<ExpirySettings> <ExpiryDate ref="{date_variable}">expiration_date</ExpiryDate> </ExpirySettings>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
屬性
<ExpiryDate ref="" />
屬性 | 說明 | 預設 | 存在必要性 | 類型 |
---|---|---|---|---|
ref |
取得值的變數。如果此元素包含文字值,則不應使用此屬性。 |
不適用 | 選用 | 字串 |
<ExpirySettings>/<TimeOfDay> 元素
快取項目應到期的時間。請使用表單 hh:mm:ss
。如有此元素,其同層級元素 <TimeoutInSeconds>
會覆寫 <TimeOfDay>
。
請以 HH:mm:ss 格式輸入時間,其中 HH 代表 24 小時制中的小時。例如下午 2:30 為 14:30:00。
針對時間,預設語言代碼和時區會因程式碼執行位置而異 (您在設定政策時無法得知)。
<ExpirySettings> <TimeOfDay ref="time_variable">expiration_time</TimeOfDay> </ExpirySettings>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
屬性
屬性 | 說明 | 預設 | 存在必要性 | 類型 |
---|---|---|---|---|
ref | 包含到期時間值的變數。 | 不適用 | 選用 | 字串 |
<ExpirySettings>/<TimeoutInSec> 元素
快取項目應在幾秒後過期。
<ExpirySettings>/<TimeoutInSeconds> 元素
快取項目應在幾秒後過期。如有此元素,它會覆寫同層的兄弟元素 <TimeOfDay>
和 <ExpiryDate>
。
<ExpirySettings> <TimeoutInSeconds ref="duration_variable">seconds_until_expiration</TimeoutInSeconds> </ExpirySettings>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
屬性
屬性 | 說明 | 預設 | 存在必要性 | 類型 |
---|---|---|---|---|
ref | 包含逾時值的變數。 |
N/A
|
選用 | 字串 |
<Scope> 元素
當 <CacheKey>
元素未提供 <Prefix>
元素時,用於建構快取鍵前置字串的列舉。
<Scope>scope_enumeration</Scope>
預設值: |
「獨家」 |
外觀狀態: |
選用 |
類型: |
字串 |
<Scope>
設定會決定快取索引鍵,並根據 <Scope>
值加在前面。舉例來說,當範圍設為 Exclusive
時,快取鍵會採用以下格式:orgName__envName__apiProxyName__proxy|TargetName__ [serializedCacheKey ].
如果 <CacheKey>
中含有 <Prefix>
元素,則會取代 <Scope>
元素值。有效值包括下列列舉。
您可以將 <Scope>
元素與 <CacheKey>
和 <Prefix>
搭配使用。詳情請參閱「使用快取鍵」。
可接受的值
範圍值 | 說明 |
---|---|
Global |
快取索引鍵會在環境中部署的所有 API Proxy 之間共用。快取索引鍵會以 orgName __ envName __ 的格式置於前方。 如果您使用 |
Application |
API Proxy 名稱會用做前置字串。 快取鍵的開頭格式為 orgName__envName__apiProxyName。 |
Proxy |
ProxyEndpoint 設定會做為前置字串使用。 快取鍵會以 orgName__envName__apiProxyName__proxyEndpointName 的格式置於前方。 |
Target |
使用 TargetEndpoint 設定做為前置字串。 快取鍵前置格式為 orgName__envName__apiProxyName__targetEndpointName。 |
Exclusive |
預設值,這是最具體的做法,因此在特定快取中發生命名空間衝突的風險也最低。 前置字串有兩種形式:
快取索引鍵,格式為 orgName__envName__apiProxyName__proxyNameITargetName 例如,完整字串可能如下所示: apifactory__test__weatherapi__default__apiAccessToken |
<SkipCacheLookup> 元素
定義運算式,如果在執行階段評估為 true,則指定應略過快取查詢,並應重新整理快取。如要瞭解如何使用 SkipCacheLookup
,請參閱「使用 ResponseCache 政策影片」。
<SkipCacheLookup>variable_condition_expression</SkipCacheLookup>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
在以下範例中,如果在傳入的標頭中將 bypass-cache 變數設為 true,系統會略過快取查詢,並重新整理快取。
<SkipCacheLookup>request.header.bypass-cache = "true"</SkipCacheLookup>
<SkipCachePopulation> 元素
定義運算式,如果運算結果在執行階段為 true,就會指定應略過寫入快取的作業。如要瞭解 SkipCachePopulation
的使用方式,請參閱這部影片。
<SkipCachePopulation>variable_condition_expression</SkipCachePopulation>
預設值: |
不適用 |
外觀狀態: |
選用 |
類型: |
字串 |
舉例來說,如果回應狀態碼為 400 以上,則下列程式碼會略過快取寫入作業:
<SkipCachePopulation>response.status.code >= 400</SkipCachePopulation>
<UseAcceptHeader> 元素
將其設為 true
,讓回應快取項目的快取鍵附加回應 Accept 標頭的值。
Apigee 會在計算快取索引鍵時使用 Accept
、Accept-Encoding
、Accept-Language
和 Accept-Charset
要求標頭。這可避免用戶端取得未要求的媒體類型。
舉例來說,假設有兩個要求來自相同的網址,其中第一個要求接受 gzip,第二個要求則不接受。系統會快取第一個要求,而快取的項目 (可能) 會是經過 GZIP 壓縮的回應。第二個要求會讀取快取值,然後可能會將 gzip 項目傳回給無法讀取 gzip 的用戶端。
詳情請參閱「設定快取鍵」一文。
<UseAcceptHeader>false</UseAcceptHeader>
預設值: |
false |
外觀狀態: |
選用 |
類型: |
布林值 |
<UseResponseCacheHeaders> 元素
將其設為 true
,即可在快取中設定回應的「存留時間」(TTL) 時,考量 HTTP 回應標頭。如果為 True,Apigee 會考量下列回應標頭的值,並在設定有效時間時,將這些值與 <ExpirySettings>
設定的值進行比較:
Cache-Control s-maxage
Cache-Control max-age
Expires
詳情請參閱「設定快取項目到期時間」。
<UseResponseCacheHeaders>false</UseResponseCacheHeaders>
預設值: |
false |
外觀狀態: |
選用 |
類型: |
布林值 |
使用須知
每個快取物件的大小上限為 256 KB。(如要進一步瞭解 Apigee 如何處理快取,請參閱「快取內部資訊」)。
您可以透過 ResponseCache 政策中的設定,讓 Apigee 在設定快取項目到期時間和快取鍵時,一併納入 HTTP 回應標頭。本節說明如何使用含有標頭的政策來管理快取到期日和快取金鑰。
如要進一步瞭解 Apigee 如何透過 ResponseCache 政策處理回應標頭,請參閱「支援 HTTP 回應標頭」。
設定快取項目到期時間
與PopulateCache 政策一樣,您可以使用 <ExpirySettings>
元素設定回應快取項目的到期日 (有效時間)。在 ResponseCache 政策中,您也可以讓 Apigee 在出現回應標頭時考量回應標頭。
如要使用回應標頭,請將 <UseResponseCacheHeaders>
元素值設為 true。這項設定會讓 Apigee 考量回應標頭,並與 <ExpirySettings>
設定的值進行比較,然後使用兩者之間的最低值。在考量回應標頭時,Apigee 會選擇可用的值,如下所述:
舉例來說,假設回應已快取,且包含下列值:
- 沒有
Cache-Control s-maxage
值 Cache-Control max-age
值為 300Expires
日期在三天內<ExpirySettings>
TimeoutInSeconds
值為 600。
在這種情況下,系統會使用 Cache-Control
max-age
值做為 TTL,因為該值低於 <ExpirySettings>
值,且沒有 Cache-Control s-maxage
值 (優先於 max-age
)。
設定快取鍵
與一般用途快取政策 (例如 PopulateCache 政策) 一樣,您可以使用 ResponseCache 中的 <CacheKey>
和 <Scope>
元素,為快取項目設定快取鍵建立作業。您也可以使用 ResponseCache,在關鍵值後方加上回應 Accept 標頭,讓快取鍵更有意義。
如需有關設定快取鍵的一般資訊,請參閱「使用快取鍵」。如要進一步瞭解如何使用 Accept 標頭,請參閱 <UseAcceptHeader>
。
關於快取加密
Apigee 和 Apigee hybrid (1.4 以上版本):快取和 KVM 資料一律會加密。
流程變數
執行 ResponseCache 政策時,系統會填入下列預先定義的 Flow 變數。如要進一步瞭解 Flow 變數,請參閱「Flow 變數參考資料」。
變數 | 類型 | 權限 | 說明 |
---|---|---|---|
responsecache.{policy_name}.cachename |
字串 | 唯讀 | 傳回政策中使用的快取 |
responsecache.{policy_name}.cachekey |
字串 | 唯讀 | 傳回所使用的鍵 |
responsecache.{policy_name}.cachehit |
布林值 | 唯讀 | 如果政策執行成功,則傳回 True |
responsecache.{policy_name}.invalidentry |
布林值 | 唯讀 | 如果快取項目無效,則傳回 true |
錯誤代碼
本節將說明在政策觸發錯誤時,系統會設定的錯誤訊息和流程變數。如果您要為 Proxy 開發錯誤規則,就必須瞭解這項資訊。如需更多資訊,請參閱「關於政策錯誤的相關資訊」和「處理錯誤」。
錯誤代碼前置字串
不適用
執行階段錯誤
這項政策不會擲回任何執行階段錯誤。
部署錯誤
部署含有這項政策的 Proxy 時,可能會發生這些錯誤。
錯誤名稱 | 原因 | 修正 |
---|---|---|
InvalidTimeout |
如果 ResponseCache 政策的 <CacheLookupTimeoutInSeconds> 元素設為負數,API Proxy 的部署作業就會失敗。 |
build |
InvalidCacheResourceReference |
如果 ResponseCache 政策中的 <CacheResource> 元素設為在部署 API Proxy 的環境中不存在的名稱,就會發生這個錯誤。 |
build |
ResponseCacheStepAttachmentNotAllowedReq |
如果在 API Proxy 的任何流程中,將相同的 ResponseCache 政策附加至多個要求路徑,就會發生這個錯誤。 |
build |
ResponseCacheStepAttachmentNotAllowedResp |
如果在 API Proxy 的任何流程中,將相同的 ResponseCache 政策附加至多個回應路徑,就會發生這個錯誤。 |
build |
InvalidMessagePatternForErrorCode |
如果 ResponseCache 政策中的 <SkipCacheLookup> 或 <SkipCachePopulation> 元素含有無效條件,就會發生這個錯誤。 |
build |
CacheNotFound |
如果未在特定的 Message Processor 元件上建立錯誤訊息中提及的特定快取,就會發生這個錯誤。 | build |
錯誤變數
不適用
錯誤回應範例
不適用
結構定義
每個政策類型都由 XML 架構 (.xsd
) 定義。如需參考,請前往 GitHub 查看政策架構。