ScopedCacheManager :スコープ指定

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

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

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

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

    ScopedCacheManager – flushScopedCache(文字列カタログ、文字列キー)

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

    表 : 1. パラメーター
    名前 タイプ 説明
    カタログ 文字列 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。
    キー 文字列 オプション。キャッシュキー。 キャッシュから単一のエントリをフラッシュするには、このパラメーターを設定します。
    表 : 2. 戻り値
    タイプ 説明
    なし

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

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

    ScopedCacheManager – get(String catalog, String key)

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

    表 : 3. パラメーター
    名前 タイプ 説明
    カタログ 文字列 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。
    キー 文字列 キャッシュキー。
    表 : 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(String catalog, String key)

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

    表 : 5. パラメーター
    名前 タイプ 説明
    カタログ 文字列 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。

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

    キー 文字列 キャッシュキー。
    表 : 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. パラメーター
    名前 タイプ 説明
    カタログ 文字列 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。
    プリフィックス 文字列 キャッシュをフラッシュするときにキーを検索するためのプリフィックス。
    表 : 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(String catalog, String key, String value)

    テーブルまたはテーブル列のペアタイプのキャッシュのスコープ付きキャッシュに値を格納します。

    表 : 9. パラメーター
    名前 タイプ 説明
    カタログ 文字列 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。
    キー 文字列 キャッシュキー。
    文字列 キャッシュエントリ。
    表 : 10. 戻り値
    タイプ 説明
    なし

    次の例は、「abc」というキーを定義して、myCache という名前のキャッシュに対して取得する方法を示しています。キャッシュは、インシデント [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(文字列カタログ、文字列キー、文字列値、アレイ ID)

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

    表 : 11. パラメーター
    名前 タイプ 説明
    カタログ 文字列 フラッシュするカタログ。 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。
    キー 文字列 新しいエントリのキャッシュキー。
    文字列 新しいエントリの値。
    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(String catalog, String key, String value, String sysId)

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

    表 : 13. パラメーター
    名前 タイプ 説明
    カタログ 文字列 スコープ済みキャッシュ [sys_scoped_cache] テーブルで定義されているキャッシュの名前。
    キー 文字列 キャッシュキー。
    文字列 キャッシュエントリ。
    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