🐥

Momento Cache 4つのコレクションデータ その3 Sets

2023/11/16に公開

今日は前回、前々回の記事に引き続いて3つめのコレクションデータ側であるSetsをやっていきます。過去の記事はこちらです。

https://zenn.dev/momentobigfun/articles/7bd04650162aed
https://zenn.dev/momentobigfun/articles/9aed9469796e81

Setsとは

https://docs.momentohq.com/ja/cache/develop/api-reference/set-collections
こちらにAPIがまとまっています。
Setsとは要素の集まりですが、各要素は一度しか現れず、順序は保証されていません。既にある要素を追加で書き込んでも、同じ要素が複数保持されることはありません。

さっそくやってみる

では早速やってみます。アイテムの作成と要素の書き込みはSetAddElementを用います。

test.js
// Declare the Momento SDK library
const {
    Configurations,
    CacheClient, CredentialProvider,
    CacheSetAddElement,
} = require('@gomomento/sdk');

// Declate the dotenv library
const dotenv = require('dotenv');

// Run the config function to bring in the .env file
dotenv.config();

// Creates the Momento cache client object
async function createCacheClient() {
    return await CacheClient.create({
        configuration: Configurations.Laptop.v1(),
        credentialProvider: CredentialProvider.fromEnvironmentVariable({
            environmentVariableName: 'MOMENTO_API_KEY',
        }),
        defaultTtlSeconds: 600,
    });
}

// A simple function that calls all functions in order. You probably want more error handling.
async function run() {
    const cacheClient = await createCacheClient();

    const result = await cacheClient.setAddElement('demo-cache', 'test-set', 'test-element');
    if (result instanceof CacheSetAddElement.Success) {
        console.log("Element added successfully to set 'test-set'");
    } else if (result instanceof CacheSetAddElement.Error) {
        throw new Error(
            `An error occurred while attempting to call cacheSetAddElement on set 'test-set' in cache 'test-cache': ${result.errorCode()}: ${result.toString()}`
        );
    }

}
run();
    const result = await cacheClient.setAddElement('demo-cache', 'test-set', 'test-element');

demo-cacheというキャッシュにtest-setというキー名でtest-elementという値を書き込みます。

Setsは複数要素を持てますので、SetAddElementsを用いることで複数要素を一度に書き込むことが出来ます。

test.js
// Declare the Momento SDK library
const {
    Configurations,
    CacheClient, CredentialProvider,
    CacheSetAddElement,CacheSetAddElements
} = require('@gomomento/sdk');

// Declate the dotenv library
const dotenv = require('dotenv');

// Run the config function to bring in the .env file
dotenv.config();

// Creates the Momento cache client object
async function createCacheClient() {
    return await CacheClient.create({
        configuration: Configurations.Laptop.v1(),
        credentialProvider: CredentialProvider.fromEnvironmentVariable({
            environmentVariableName: 'MOMENTO_API_KEY',
        }),
        defaultTtlSeconds: 600,
    });
}

// A simple function that calls all functions in order. You probably want more error handling.
async function run() {
    const cacheClient = await createCacheClient();

    const result = await cacheClient.setAddElements('demo-cache', 'test-set', ['test-element','test-element1', 'test-element2']);
    if (result instanceof CacheSetAddElements.Success) {
      console.log("Elements added successfully to set 'test-set'");
    } else if (result instanceof CacheSetAddElements.Error) {
      throw new Error(
        `An error occurred while attempting to call cacheSetAddElements on set 'test-set' in cache 'test-cache': ${result.errorCode()}: ${result.toString()}`
      );
    }

}
run();
const result = await cacheClient.setAddElements('demo-cache', 'test-set', ['test-element','test-element1', 'test-element2']);

demo-cacheというキャッシュにtest-setというキー名でtest-elementtest-element1test-element2という値を書き込みます。
先ほどのサンプルで既にtest-elementが書き込まれていますので、新たに追加されることはなく、test-element1test-element2だけが追加されます。

同様に順不同なDictionaryは、タイミングで複数要素が表示される順番はことなりましたが、Setsの場合何度呼び出しを行っても同じ順番で出力されるようです。ただし、仕様上は順番を保証していないので気を付ける必要があります。

呼び出しはSetFetchで行います。

test.js
// Declare the Momento SDK library
const {
    Configurations,
    CacheClient, CredentialProvider,
    CacheSetAddElement, CacheSetAddElements,
    CacheSetFetch
} = require('@gomomento/sdk');

// Declate the dotenv library
const dotenv = require('dotenv');

// Run the config function to bring in the .env file
dotenv.config();

// Creates the Momento cache client object
async function createCacheClient() {
    return await CacheClient.create({
        configuration: Configurations.Laptop.v1(),
        credentialProvider: CredentialProvider.fromEnvironmentVariable({
            environmentVariableName: 'MOMENTO_API_KEY',
        }),
        defaultTtlSeconds: 600,
    });
}

// A simple function that calls all functions in order. You probably want more error handling.
async function run() {
    const cacheClient = await createCacheClient();

    await cacheClient.setAddElements('demo-cache', 'test-set', ['test-element', 'test-element1', 'test-element2']);

    const result = await cacheClient.setFetch('demo-cache', 'test-set');
    if (result instanceof CacheSetFetch.Hit) {
        console.log('Set fetched successfully- ');
        result.valueSet().forEach((value, key) => {
            console.log(`${key} : ${value}`);
        });
    } else if (result instanceof CacheSetFetch.Miss) {
        console.log("Set 'test-set' was not found in cache 'test-cache'");
    } else if (result instanceof CacheSetFetch.Error) {
        throw new Error(
            `An error occurred while attempting to call cacheSetFetch on set 'test-set' in cache 'test-cache': ${result.errorCode()}: ${result.toString()}`
        );
    }
}
run();
const result = await cacheClient.setFetch('demo-cache', 'test-set');
Set fetched successfully- 
test-element2 : test-element2
test-element1 : test-element1
test-element : test-element

削除を行うのはSetRemoveElementです。複数要素を持つ場合、特定の要素のみを削除できます。

test.js
// Declare the Momento SDK library
const {
    Configurations,
    CacheClient, CredentialProvider,
    CacheSetAddElement, CacheSetAddElements,
    CacheSetFetch,
    CacheSetRemoveElement,
} = require('@gomomento/sdk');

// Declate the dotenv library
const dotenv = require('dotenv');

// Run the config function to bring in the .env file
dotenv.config();

// Creates the Momento cache client object
async function createCacheClient() {
    return await CacheClient.create({
        configuration: Configurations.Laptop.v1(),
        credentialProvider: CredentialProvider.fromEnvironmentVariable({
            environmentVariableName: 'MOMENTO_API_KEY',
        }),
        defaultTtlSeconds: 600,
    });
}

// A simple function that calls all functions in order. You probably want more error handling.
async function run() {
    const cacheClient = await createCacheClient();

    await cacheClient.setAddElements('demo-cache', 'test-set', ['test-element', 'test-element1', 'test-element2']);
    const result = await cacheClient.setRemoveElement('demo-cache', 'test-set', 'test-element');
    if (result instanceof CacheSetRemoveElement.Success) {
        console.log("Element 'test-element' removed successfully from set 'test-set'");
    } else if (result instanceof CacheSetRemoveElement.Error) {
        throw new Error(
            `An error occurred while attempting to call cacheSetRemoveElement on set 'test-set' in cache 'test-cache': ${result.errorCode()}: ${result.toString()}`
        );
    }

}
run();
const result = await cacheClient.setRemoveElement('demo-cache', 'test-set', 'test-element');

前回同様削除は通常のキャッシュアイテムとしてtest-setをキーとして削除できます。

またある要素がSetsアイテムの中に含まれているかどうかを判別するる関数としてSetContainsElementSetContainsElementsが定義されていますが、JavsScriptSDKにはまだデプロイされていない様です。
https://docs.momentohq.com/ja/cache/develop/api-reference/language-support
こちらは使えるようになり次第記事を更新する予定です。

Discussion