Introduction
先日、この記事やこの記事で、Momentoのコレクション型について紹介しました。
記事を書いた時点ではまだPreviewだったのですが、
先日正式サポートされました。
本稿ではあらためてMomentoにおけるCollection Data Typeについて紹介します。
Collection Data?
今回Momentoでサポートされたデータタイプは
List・Set・Dictionaryの3つです。
今までは文字列型かバイト型しか渡せませんでしたが、
これらコレクション型をMomentoで扱えるようになり、
利便性・柔軟性が増しました。
各タイプの特徴は、ここで詳細に解説しているのでご確認ください。
また、実際にJavaScriptやRustでコレクションデータ型を使った記事もあるので、
こちらもご確認ください。
※記事はプレビュー版のときのもの
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のセミナーを開催します。
興味があるかたはぜひご参加ください。