MomentoがCollection Data Typeを正式サポートしました
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のセミナーを開催します。
興味があるかたはぜひご参加ください。