MomentoがCollection Data Typeを正式サポートしました

2023.02.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Introduction

先日、この記事この記事で、Momentoのコレクション型について紹介しました。
記事を書いた時点ではまだPreviewだったのですが、
先日正式サポートされました。

本稿ではあらためてMomentoにおけるCollection Data Typeについて紹介します。

Collection Data?

今回Momentoでサポートされたデータタイプは
List・Set・Dictionaryの3つです。
今までは文字列型かバイト型しか渡せませんでしたが、
これらコレクション型をMomentoで扱えるようになり、
利便性・柔軟性が増しました。

各タイプの特徴は、ここで詳細に解説しているのでご確認ください。

また、実際にJavaScriptRustでコレクションデータ型を使った記事もあるので、
こちらもご確認ください。
※記事はプレビュー版のときのもの

Environment

今回試した環境は以下のとおりです。

  • MacBook Pro (13-inch, M1, 2020)
  • OS : MacOS 12.4
  • Momento CLI : v0.22.1
  • Node : v18.2.0

DevIOのMomento関連記事はここにあるので、
これらもご確認ください。

Setup

いつものMomentoセットアップです。
このあたりを参考に、
MomentoのCLIインストールと認証トークンを取得しましょう。

認証トークンを取得したらコンソールでCLI用・プログラム用に
トークンをセットしておきます。

# CLI用
% momento configure
Please paste your Momento auth token.  
(If you do not have an auth token, use `momento account` to generate one.)
Windows users: if CTRL-V does not work, try right-click or SHIFT-INSERT to paste.

Token [****]:<認証トークン>

 ・・・

#プログラム用
% export MOMENTO_AUTH_TOKEN = <取得した認証トークン>

Try

では、先日リリースされたNode用クライアントライブラリを使って試してみます。

% mkdir momento-example && cd momento-example
% npm install @gomomento/sdk

main.tsファイルを作成して、main関数内に
プログラムを記述していきます。

import {
    //必要に応じてimportを追加
    CacheListFetch,
    SimpleCacheClient,
    EnvMomentoTokenProvider,
    Configurations,
    MomentoLoggerFactory,
    DefaultMomentoLoggerFactory,
} from '@gomomento/sdk';
  
const cacheName = 'example-cache';
const loggerFactory: MomentoLoggerFactory = new DefaultMomentoLoggerFactory();
const defaultTtl = 30;

// 認証トークンを設定
const credentialsProvider = new EnvMomentoTokenProvider({
    environmentVariableName: 'MOMENTO_AUTH_TOKEN',
});


// momentoクライアント初期化
const momento = new SimpleCacheClient({
    configuration: Configurations.Laptop.latest(loggerFactory),
    credentialProvider: credentialsProvider,
    defaultTtlSeconds: defaultTtl,
});


const main = async () => {

  //ここにコードを記述していく

}

main()
.then(() => {
    //nothing
})
.catch((e: Error) => {
    console.error(`failed to get from cache ${e.message}`);
    throw e;
});

ここで使用するキャッシュは、CLIのmomento cache createコマンドで
作成しておく必要があります。
また、プログラム実行は↓のようにします。

% npx ts-node main.ts

Listを使う

ではListをつかってみましょう。
listPushBackで順番にリストへ要素の追加を行い、
listFetchで要素を取り出しています。

    //main関数内
    await momento.listPushBack(cacheName, "key_1", "msg_1");      
    await momento.listPushBack(cacheName, "key_2", "msg_2");      
    await momento.listPushBack(cacheName, "key_3", "msg_3");      

    const list_result:CacheListFetch.Response = await momento.listFetch(cacheName, "key_2");      

    if (list_result instanceof CacheListFetch.Hit) {
        const valuesList = list_result.valueListString();
        const array = [...valuesList];
        console.log(array);
      }

Setを使う

Setaは重複を許可しないコレクションです。
ちなみに、この発展型でソート済みSet(SortedSet)も先日実装されました。

setAddElementでSetに要素を追加、setFetchでSetを取得します。
重複要素を許可しないので、同じキーで要素をセットしても
1回しかセットされません。

    await momento.setAddElement(cacheName, "s_key", "svalue_1");
    await momento.setAddElement(cacheName, "s_key", "svalue_2");
    await momento.setAddElement(cacheName, "s_key", "svalue_3");
    await momento.setAddElement(cacheName, "s_key", "svalue_3");

    const result_set = await momento.setFetch(cacheName, "s_key");  
    if (result_set instanceof CacheSetFetch.Hit) {
        const valuesSet = result_set.valueSetString();
        const array = [...valuesSet];
        console.log(array); // [svalue_3,svalue_2,svalue_1] 
    }

Dictionaryを使う

データを取得する際、不要なデータもまとめて取得するのは無駄です。
Dictionaryを使えば、任意のフィールドを指定して
必要なデータだけ取得できます。

下記プログラムでは、Personディクショナリに
nameやjobといった要素を登録し、任意のフィールドの値を取得しています。
必要なフィールドのみ指定することで、
無駄なデータ送受信を防ぐことができます。

  let dictName = "Person";
  const dictionarySetFieldsResponse = await momento.dictionarySetFields(
    cacheName,
    dictName,
    new Map([
      ['job', 'pg'],
      ['name', 'taro'],
      ['age', '30'],
    ]),
    {
    }
  );

  const fieldsList = ['job', 'name'];
  const dictionaryGetFieldsResponse = 
    await momento.dictionaryGetFields(cacheName,dictName,fieldsList);
  if (dictionaryGetFieldsResponse instanceof CacheDictionaryGetFields.Hit) {
    console.log(JSON.stringify(dictionaryGetFieldsResponse.valueRecord(),null,2));
  } else {
    throw new Error(`Unexpected response: ${dictionaryGetFieldsResponse.toString()}`);
  }

その他のテクニック

その他、 Auto TruncateやByte対応、TTL(Time to Live)の効率化について Momentoのblogにて解説されているので、 確認してみてください。

Summary

今回は正式リリースされた、MomentoのCollection Dataについて紹介しました。
現在は、下記SDKでCollection Dataを試すことができるので、
お好みの環境で動かしてみましょう。

Rustはまだプレビュー中です

なお、Momentoについてのお問い合わせはこちらです。
お気軽にお問い合わせください。

Seminar Announcement about Momento

2023年4月6日(木) 16:00からMomentoのセミナーを開催します。
興味があるかたはぜひご参加ください。

References