ScopedCacheManager - スコープ指定

  • リリースバージョン: Xanadu
  • 更新日 2024年08月01日
  • 所要時間:15分
  • ScopedCacheManager API は、スコープ対象のアプリケーションのキャッシュデータを取得、設定、およびフラッシュするためのメソッドを提供します。

    この API にはスコープ済みキャッシュ (com.glide.scopedcache) プラグインが必要で、 sn_scoped_cache 名前空間で実行されます。プラグインはデフォルトでインストールされ、アクティブ化されています。

    これらのメソッドでは、1 つ以上のスコープ対象のキャッシュおよびスコープ対象のキャッシュのペアを定義する必要があります。スコープ付きキャッシュの作成の詳細については、『 ScopedCacheManager API 開発者ガイド』を参照してください。

    スコープ対象のキャッシュでこの API を使用すると、次のような利点があります。
    • メモリー内に存在するスコープ対象アプリケーションの文字列をトランザクション間でキャッシュする。
    • スコープ対象のアプリケーションのデータをメモリーにキャッシュし、基礎となるテーブルの変更に基づいてこのデータをフラッシュする。
    • トランザクションライフサイクル外でキャッシュデータを定義して使用する。
    • 後ですぐにアクセスできるように、コストの高い操作や計算の出力をキャッシュする。

    ScopedCacheManager –flushScopedCache(文字列 catalog, 文字列 key)

    キャッシュ全体または単一のエントリーをキャッシュからフラッシュします。

    表 : 1. パラメーター
    名前 タイプ 説明
    catalog 文字列 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
    key 文字列 オプション。キャッシュキー。 キャッシュから単一のエントリーをフラッシュするには、このパラメーターを設定します。
    表 : 2. 返される内容
    タイプ 説明
    なし

    次の例は、myCache というキャッシュから「abc」というキーをフラッシュする方法を示しています。キャッシュ全体をフラッシュするには、キーパラメーターを省略します。

    sn_scoped_cache.ScopedCacheManager.flushScopedCache("myCache", "abc");

    ScopedCacheManager –get(文字列 catalog, 文字列 key)

    キャッシュから値を取得します。

    表 : 3. パラメーター
    名前 タイプ 説明
    catalog 文字列 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
    key 文字列 キャッシュキー。
    表 : 4. 返される内容
    タイプ 説明
    文字列 キャッシュエントリ。

    次の例は、簡単な説明の文字数がキー (50 字) よりも大きいインシデントレコードの数をカウントする方法を示しています。このケースでは、簡単な説明の文字数が 50 字を超えるインシデントレコードは 6 つあります。この値は再利用可能な文字列としてキャッシュに格納されるため、値を取得するたびに計算する必要はありません。

    var cache2 = "Cache 2"; // column pair type
    
    // Re-populate the column cache
    for (var i = 0; i < 100; i+=10) {
        var inc = new GlideRecord('incident');
        inc.query();
        var counter = 0;
        while (inc.next()) {
            if (inc.getValue('short_description').length > i)
            counter++;
        }
        sn_scoped_cache.ScopedCacheManager.put(cache2, i.toString(), counter.toString());
    }
    
    // script to get values from column cache
    gs.info(sn_scoped_cache.ScopedCacheManager.get(cache2, "50"));

    出力:

    scoped_app: 6

    ScopedCacheManager – getCacheEntryDetails(文字列カタログ, 文字列キー)

    バイトサイズ、オブジェクトタイプ、エントリー値などのキャッシュエントリーの詳細を取得します。

    表 : 5. パラメーター
    名前 タイプ 説明
    catalog 文字列 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。

    カタログ名には、スコープ名とキャレット文字の接頭辞を付ける必要があります。たとえば、グローバルスコープの「test_cache」には 「global^test_cache」というプリフィックスが付きます。

    key 文字列 キャッシュキー。
    表 : 6. 返される内容
    タイプ 説明
    文字列 <ObjectType> (<EntrySize>): <Value.toString()> 形式の文字列。

    次の例は、 test_cache という名前のスコープ済みキャッシュのキャッシュエントリの詳細を表示する方法を示しています。

    sn_scoped_cache.ScopedCacheManager.put("test_cache", "key1", "val1");
    gs.info(sn_scoped_cache.ScopedCacheManager.getCacheEntryDetails("global^test_cache", "key1"));

    出力:

    java.lang.String (48):
    val1

    ScopedCacheManager – prefixFlush(文字列カタログ, 文字列接頭辞)

    指定したプリフィックスで始まるキーを持つすべてのキャッシュエントリをフラッシュします。

    表 : 7. パラメーター
    名前 タイプ 説明
    catalog 文字列 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
    prefix 文字列 キャッシュをフラッシュするときにキーを検索するプリフィックス。
    表 : 8. 返される内容
    タイプ 説明
    なし

    次の例は、プレフィックス a を持つキーのキャッシュ値をフラッシュする方法を示しています。

    sn_scoped_cache.ScopedCacheManager.put("test_cache", "aKey1", "val1");
    sn_scoped_cache.ScopedCacheManager.put("test_cache", "aKey2", "val2");
    sn_scoped_cache.ScopedCacheManager.put("test_cache", "bKey1", "val3");
    
    sn_scoped_cache.ScopedCacheManager.prefixFlush("test_cache", "a");
    
    gs.info(sn_scoped_cache.ScopedCacheManager.get("test_cache", "aKey1"));
    gs.info(sn_scoped_cache.ScopedCacheManager.get("test_cache", "aKey2"));
    gs.info(sn_scoped_cache.ScopedCacheManager.get("test_cache", "bKey1"));

    出力:

    *** Script: null
    *** Script: null
    *** Script: val3

    ScopedCacheManager – put(文字列 catalog, 文字列 key, 文字列 value)

    [テーブル] または [テーブルの列] のペアタイプであるキャッシュのスコープ対象のキャッシュに値を格納します。

    表 : 9. パラメーター
    名前 タイプ 説明
    catalog 文字列 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
    key 文字列 キャッシュキー。
    value 文字列 キャッシュエントリ。
    表 : 10. 返される内容
    タイプ 説明
    なし

    次の例は、myCache というキャッシュに「abc」というキーを定義して取得する方法を示しています。キャッシュは、インシデント [incident] テーブルとペアになっています。この例では、インシデントレコードの説明フィールドを更新した後にキャッシュをフラッシュする方法も示しています。

    //put value in cache for key "abc"
    gs.info("put key 'abc' into cache with value 'value1'");
    sn_scoped_cache.ScopedCacheManager.put("myCache", "abc", "value1");
    
    // retrieve value from cache for key "abc"
    gs.info("value of 'abc' in cache: ");
    gs.info(sn_scoped_cache.ScopedCacheManager.get("myCache", "abc")+"\n");
    
    //update an incident record (add string to the description field)
    gs.info("Updating incident record.");
    var gr = new GlideRecord("incident");
    gr.get("<incident_sys_id>");
    gr.description= "test12345";
    if (gr.update()) {
        gs.info("Record updated successfully.\n");
    };
    
    //retrieve the value from cache for key "abc"
    gs.info("Retrieving 'abc' from cache. Value should be null because a table pair was updated.");
    gs.info(sn_scoped_cache.ScopedCacheManager.get("myCache", "abc"));

    出力:

    scoped_app: put key 'abc' into cache with value 'value1'
    scoped_app: value of 'abc' in cache: 
    scoped_app: value1
    
    scoped_app: Updating incident record.
    scoped_app: Record updated successfully.
    
    scoped_app: Retrieving 'abc' from cache. Value should be null because a table pair was updated.
    scoped_app: null

    ScopedCacheManager – putMultiRow(文字列カタログ, 文字列キー, 文字列値, 配列 ids)

    キャッシュにエントリを配置し、指定されたsys_idsを持つすべてのレコードをそのエントリのフラッシュソースとして設定します。このメソッドは、 テーブル または テーブル列の ペアタイプのキャッシュを対象としています。

    表 : 11. パラメーター
    名前 タイプ 説明
    catalog 文字列 フラッシュするカタログ。 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
    key 文字列 新しいエントリのキャッシュキー。
    文字列 新しいエントリの値。
    ID アレイ エントリのフラッシュソースとして使用されるレコードのsys_idsリスト。これらのレコードは、異なるテーブルからのものである場合があります。
    表 : 12. 返される内容
    タイプ 説明
    なし

    次の例は、インシデントとユーザーレコードをフラッシュポイントとして使用する方法を示しています。指定されたレコードのいずれかが更新されると、test_cacheキー INC0000060がフラッシュされます。

    // This example requires a table-row pair for the "incident" and "sys_user" tables assigned to a cache named test_cache
    var inc1ID = "1c741bd70b2322007518478d83673af3";
    var userID = "681ccaf9c0a8016400b98a06818d57c7";
    
    // update to email should invalidate the entry
    gs.info("initial put");
    putCacheEntry();
    gs.info("cache value for INC0060: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    var gr = new GlideRecord("sys_user");
    gr.get(userID);
    gr.setValue("email", "a" + gr.getValue("email"));
    gr.update();
    gs.info("updated user email");
    gs.info("cache value: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    
    // update to incident number should invalidate the entry.
    gs.info("second put");
    putCacheEntry();
    gs.info("cache value: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    var gr = new GlideRecord("incident");
    gr.get(inc1ID);
    gr.setValue("number", gr.getValue("number") + "1");
    gr.update();
    gs.info("updated incident number");
    gs.info("cache value: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    
    function putCacheEntry() {
        var incGr = new GlideRecord("incident");
        incGr.get(inc1ID);
        var userGr = new GlideRecord("sys_user");
        userGr.get(userID);
        // the cache stores that the incident is assigned to a specific user. So if the incident or user record changes, we should flush.
        sn_scoped_cache.ScopedCacheManager.putMultiRow("test_cache",incGr.getValue("number"), userGr.getValue("email"), [inc1ID, userID]);
    }

    出力:

    *** Script: initial put
    *** Script: cache value for INC0060: employee@example.com
    *** Script: Updating Joe Employee's primary email device based on change to user record email address
    *** Script: updated user email
    *** Script: cache value: null
    *** Script: second put
    *** Script: cache value: aemployee@example.com
    *** Script: updated incident number
    *** Script: cache value: null

    ScopedCacheManager – putRow(文字列カタログ, 文字列キー, 文字列値, 文字列 sysId)

    キャッシュの単一の行 (テーブル) に値を格納します。この方法は、[テーブルの行] または [テーブルの行と列] のペアタイプのキャッシュに使用します。

    表 : 13. パラメーター
    名前 タイプ 説明
    catalog 文字列 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
    key 文字列 キャッシュキー。
    value 文字列 キャッシュエントリ。
    sysId 文字列 オプション。テーブル内の行、すなわち追跡対象のレコードの sys_id。
    表 : 14. 返される内容
    タイプ 説明
    なし

    次の例では、incident_cache というテーブル行のペアキャッシュタイプを使用しています。キャッシュによってインシデントの発信者 ID が追加され、変更されたレコードの sys_id に関連付けられたキャッシュエントリーがクリアされます。

    // build the cache:
    var number = 'INC0009009';
    var inc = new GlideRecord('incident');
    inc.addQuery('number', number);
    inc.query();
    inc.next();
    var entry = inc.caller_id.getDisplayValue();
    sn_scoped_cache.ScopedCacheManager.putRow("incident_cache", inc.getValue('number'), entry, inc.getValue('sys_id'));
    gs.info(sn_scoped_cache.ScopedCacheManager.get("incident_cache", number));
    
    // when the incident is altered, the cache entry will be flushed.
    inc = new GlideRecord('incident');
    inc.addQuery('number', number);
    inc.query();
    inc.next();
    inc.setValue('short_description', inc.getValue('short_description') + "a");
    inc.update();
    gs.info(sn_scoped_cache.ScopedCacheManager.get("incident_cache", number));

    出力:

    scoped_app: John Jones
    scoped_app: null