ScopedCacheManager :スコープ指定
ScopedCacheManager API は、スコープ対象のアプリケーションのキャッシュ データを取得、設定、およびフラッシュするためのメソッドを提供します。
この API には Scoped Cache (com.glide.scopedcache) プラグインが必要であり、 sn_scoped_cache 名前空間で実行されます。プラグインはデフォルトでインストールされ、アクティブ化されています。
これらのメソッドでは、1 つ以上のスコープ対象のキャッシュおよびスコープ対象のキャッシュのペアを定義する必要があります。スコープ付きキャッシュの作成の詳細については、『 ScopedCacheManager API 開発者ガイド』を参照してください。
- メモリー内に存在するスコープ対象アプリケーションの文字列をトランザクション間でキャッシュする。
- スコープ対象のアプリケーションのデータをメモリーにキャッシュし、基礎となるテーブルの変更に基づいてこのデータをフラッシュする。
- トランザクションライフサイクル外でキャッシュデータを定義して使用する。
- 後ですぐにアクセスできるように、コストの高い操作や計算の出力をキャッシュする。
ScopedCacheManager –flushScopedCache(文字列 catalog, 文字列 key)
キャッシュ全体または単一のエントリーをキャッシュからフラッシュします。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。 |
| key | 文字列 | オプション。キャッシュキー。 キャッシュから単一のエントリーをフラッシュするには、このパラメーターを設定します。 |
| タイプ | 説明 |
|---|---|
| なし |
次の例は、myCache というキャッシュから「abc」というキーをフラッシュする方法を示しています。キャッシュ全体をフラッシュするには、キーパラメーターを省略します。
sn_scoped_cache.ScopedCacheManager.flushScopedCache("myCache", "abc");
ScopedCacheManager –get(文字列 catalog, 文字列 key)
キャッシュから値を取得します。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。 |
| key | 文字列 | キャッシュキー。 |
| タイプ | 説明 |
|---|---|
| 文字列 | キャッシュエントリ。 |
次の例は、簡単な説明の文字数がキー (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(文字列カタログ, 文字列キー)
バイトサイズ、オブジェクトタイプ、エントリ値などのキャッシュエントリの詳細を取得します。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。
カタログ名には、スコープ名とキャレット文字をプレフィックスとして付ける必要があります。たとえば、グローバルスコープの「test_cache」には |
| key | 文字列 | キャッシュキー。 |
| タイプ | 説明 |
|---|---|
| 文字列 | <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(文字列カタログ、文字列プレフィックス)
指定したプリフィックスで始まるキーを持つすべてのキャッシュエントリをフラッシュします。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。 |
| prefix | 文字列 | キャッシュをフラッシュするときにキーを検索するプリフィックス。 |
| タイプ | 説明 |
|---|---|
| なし |
次の例は、プレフィックス 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)
[テーブル] または [テーブルの列] のペアタイプであるキャッシュのスコープ対象のキャッシュに値を格納します。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。 |
| key | 文字列 | キャッシュキー。 |
| value | 文字列 | キャッシュエントリ。 |
| タイプ | 説明 |
|---|---|
| なし |
次の例は、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(文字列カタログ, 文字列キー, 文字列値, 配列 ID)
エントリをキャッシュに入れ、指定したsys_idsを持つすべてのレコードをそのエントリのフラッシュソースとして設定します。このメソッドは、 テーブル または テーブル列 のペアタイプのキャッシュを対象としています。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | フラッシュするカタログ。 スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。 |
| キー | 文字列 | 新しいエントリのキャッシュキー。 |
| 値 | 文字列 | 新規エントリの値。 |
| ID | アレイ | エントリのフラッシュソースとして使用されるレコードのsys_idsのリスト。これらのレコードは、異なるテーブルからのものである可能性があります。 |
| タイプ | 説明 |
|---|---|
| なし |
次の例は、インシデントとユーザーレコードをフラッシュポイントとして使用する方法を示しています。指定したレコードのいずれかが更新されると、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)
キャッシュの単一の行 (テーブル) に値を格納します。この方法は、[テーブルの行] または [テーブルの行と列] のペアタイプのキャッシュに使用します。
| 名前 | タイプ | 説明 |
|---|---|---|
| catalog | 文字列 | スコープ付きキャッシュ [sys_scoped_cache] テーブルで定義されたキャッシュの名前。 |
| key | 文字列 | キャッシュキー。 |
| value | 文字列 | キャッシュエントリ。 |
| sysId | 文字列 | オプション。テーブル内の行、すなわち追跡対象のレコードの sys_id。 |
| タイプ | 説明 |
|---|---|
| なし |
次の例では、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