例: 汎用キャッシュの使用

ポリシーを使用してデータを汎用キャッシュに格納すると、データをより高速に取得できるようになります。以下のポリシーを使用することで、プロキシは実行時にキャッシュへのデータの格納とキャッシュからのデータの取得を行うことができます。

これらのポリシーは、プロキシで使用するデータの汎用キャッシュ処理を目的として設計されています。

このトピックのサンプルコードは、GitHub の送信 OAuth サンプル プロキシに基づいています(サンプルリストを参照)。このサンプルでは、キャッシュ ポリシーを使用して OAuth アクセス トークンを格納し、複数の送信呼び出しで再利用できるようにします。

各ポリシータイプは XML スキーマ(.xsd)で定義されています。GitHub に参照用のポリシー スキーマが用意されています。

以下の例で、OAuth アクセス トークンは PopulateCache ポリシーを使用してキャッシュに書き込まれています。書き込まれた OAuth トークンは、LookupCache ポリシーによって後続のリクエストで取得されます。このアクセス トークンの期限が切れると、JavaScript を使用して新しいアクセス トークンが取得され、今度はそれが PopulateCache ポリシーによってキャッシュに保存されます。

キャッシュの設定

キャッシュへのデータの書き込みには、PopulateCache ポリシーを使用します。この例では、OAuth アクセス トークンをキャッシュに書き込みます。ポリシーのリファレンス情報については、Populate Cache ポリシーをご覧ください。

<PopulateCache name="token-cache">
    <!-- The cache to write to. -->
    <CacheResource>mycache</CacheResource>
    <!-- The source of the data, a variable containing the value. -->
    <Source>twitter-translate.apiAccessToken</Source>
    <!-- An enumeration representing a prefix for namespace scope. -->
    <Scope>Exclusive</Scope>
    <!-- A unique pointer (a flow variable value) to the data. Use this later to retrieve it. -->
    <CacheKey>
        <KeyFragment>apiAccessToken</KeyFragment>
        <KeyFragment ref="request.queryparam.client_id"></KeyFragment>
    </CacheKey>
    <!-- Entries placed into the cache with this policy will expire after 600 seconds. -->
    <ExpirySettings>
        <TimeoutInSec>600</TimeoutInSec>
    </ExpirySettings>
</PopulateCache>

変数は、ポリシーまたはコードによって設定できます。この例の Source 変数は、次の JavaScript 呼び出し context.setVariable('twitter-translate.apiAccessToken', getAccessToken()); によって設定されます。

キャッシュキーの詳細については、キャッシュキーの操作をご覧ください。

キャッシュに保存されたデータのルックアップ

LookupCache ポリシーを使用してキャッシュに保存された値を取得できます。次の LookupCache ポリシーは、mycache から値を読み取り、その値を変数 twitter-translate.apiAccessToken に書き込みます。ポリシーのリファレンス情報については、LookupCache ポリシーをご覧ください。

<LookupCache name="token-cache">
    <!-- The cache to read from. -->
    <CacheResource>mycache</CacheResource>
    <!-- Where to assign the retrieved value - here, a variable. -->
    <AssignTo>twitter-translate.apiAccessToken</AssignTo>
    <!-- An enumeration representing a prefix for namespace scope. -->
    <Scope>Exclusive</Scope>
    <!-- The unique pointer (a flow variable value) that was used to store the data in the cache. -->

    <CacheKey>
        <KeyFragment>apiAccessToken</KeyFragment>
        <KeyFragment ref="request.queryparam.client_id"></KeyFragment>
    </CacheKey>
</LookupCache>

キャッシュの無効化

キャッシュは、HTTP ヘッダーを指定することで明示的に無効にできます。指定された HTTP ヘッダーを含むリクエストの受信時に、キャッシュがフラッシュされます。ポリシーのリファレンス情報については、InvalidateCache ポリシーをご覧ください。

<InvalidateCache name="InvalidateMyCache">
    <!-- The cache to invalidate. -->
    <CacheResource>test-cache</CacheResource>
    <!-- An enumeration representing a prefix for namespace scope. -->
    <Scope>Exclusive</Scope>
    <!-- Fragments constructing the unique pointer used when
        the data was put into the cache. -->
    <CacheKey>
        <KeyFragment>apiAccessToken</KeyFragment>
        <KeyFragment ref="request.queryparam.client_id" />
    </CacheKey>
    <PurgeChildEntries>true</PurgeChildEntries>
</InvalidateCache>