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

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

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

このトピックに記載するサンプルコードは、Github の Outbound 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>