Momento Cache Time to Live APIs

2023/09/30に公開

API reference for Momento Cache (Time to Live APIs)

API reference for Momento Cacheに掲載されている
Time to Live APIsに関するメモです。

Momento CacheのAPIには種類がある

Momento CacheのAPIには主に3種類のAPIが存在します。

  • Control
  • Data
  • Time to Live

他にも認証用のAPIや特定のデータ型を操作するAPIがあります。
今回は基本となるTime to Live APIsについて解説します。

おさらい:Time to Live(TTL)とは

主にインフラの分野において使われるIT用語、よく生存期間と直訳されますが
データの有効期間という意味合いで使われます。

たとえば、TTLが60秒のデータが存在する場合は60秒間そのデータを使えるようにするという意味があります。
ネットワークの分野ではパケットデータの有効期間としてTTLが存在します。

MomentoにおけるTTL

結論を言うと同じ意味です。Momentoにおいても同じ意味で扱われます。
Momentoではキャッシュ単位ではなく、キャッシュに格納されたデータに対してTTLを設定できます。

Momento Cache APIではData APIsでTTLの設定ができます。
ただし、Data APIsでTTLを設定する際はキャッシュにデータをセットする時(Set API)とキーと値を関連づける時(SetIfNotExists)のみです。

TTLを操作する場合はTime to Live APIsを利用します。

Time to Live APIsでは何ができるのか

主にMomento上にあるキャッシュデータを操作できます。すでに作成されているキャッシュに対して有効です。

メソッド 操作内容
UpdateTtl Momento Cache上にキャッシュされたデータのTTLを更新する
IncreaseTtl Momento Cache上にキャッシュされたデータのTTLを指定された数値だけ加算します
DecreaseTtl Momento Cache上にキャッシュされたデータのTTLを指定された数値だけ減算します
ItemGetTtl Momento Cache上にキャッシュされたデータのTTLを取得します

UpdateTtl

キャッシュされたデータのTTLを秒単位で指定した値に上書きします。
以下にサンプルコードを示します。

import { CacheClient, CredentialProvider, Configurations, CreateCache, CacheSet, CacheUpdateTtl } from '@gomomento/sdk';

async function momento_create_cache(cache_client, cache_name) {
  const result = await cache_client.createCache(cache_name);
  if (result instanceof CreateCache.Success) {
    console.log(`Cache ${cache_name} created`);
  } else if (result instanceof CreateCache.AlreadyExists) {
    console.log(`Cache ${cache_name} already exists`);
  } else if (result instanceof CreateCache.Error) {
    throw new Error(
      `An error occurred while attempting to create cache ${cache_name}: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_set_data(cache_client, cache_name, key_name, key_value) {
  const result = await cache_client.set(cache_name, key_name, key_value);
  if (result instanceof CacheSet.Success) {
    console.log(`Key ${key_name} stored successfully`);
  } else if (result instanceof CacheSet.Error) {
    throw new Error(
      `An error occurred while attempting to store key 'test-key' in cache cache_name: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_update_ttl(cache_client, cacheName, cacheKey, second) {
  const result = await cache_client.updateTtl(cacheName, cacheKey, 1000 * second);
  if (result instanceof CacheUpdateTtl.Set) {
    console.log(`${cacheKey} update ttl ${second}s`);
  } else if (result instanceof CacheUpdateTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  }
}

export default function main() {

  const cache_client = new CacheClient({
    configuration: Configurations.Laptop.v1(),
    defaultTtlSeconds: 60,
    credentialProvider: CredentialProvider.fromEnvironmentVariable({
      environmentVariableName: 'MOMENTO_API_KEY'
    })
  });

  const cacheName = 'test_ttl_cache';
  const cacheKey = 'sample';

  momento_create_cache(cache_client, cacheName, cacheKey);
  momento_set_data(cache_client, cacheName, cacheKey, 'data');
  momento_update_ttl(cache_client, cacheName, cacheKey, 120);
}

main();

IncreaseTtl

指定された数値でTTLの値を加算します。

以下にサンプルコードを示します。

import { CacheClient, CredentialProvider, Configurations, CreateCache, CacheSet, CacheUpdateTtl, CacheIncreaseTtl } from '@gomomento/sdk';

async function momento_create_cache(cache_client, cache_name) {
  const result = await cache_client.createCache(cache_name);
  if (result instanceof CreateCache.Success) {
    console.log(`Cache ${cache_name} created`);
  } else if (result instanceof CreateCache.AlreadyExists) {
    console.log(`Cache ${cache_name} already exists`);
  } else if (result instanceof CreateCache.Error) {
    throw new Error(
      `An error occurred while attempting to create cache ${cache_name}: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_set_data(cache_client, cache_name, key_name, key_value) {
  const result = await cache_client.set(cache_name, key_name, key_value);
  if (result instanceof CacheSet.Success) {
    console.log(`Key ${key_name} stored successfully`);
  } else if (result instanceof CacheSet.Error) {
    throw new Error(
      `An error occurred while attempting to store key 'test-key' in cache cache_name: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_update_ttl(cache_client, cacheName, cacheKey, second) {
  const result = await cache_client.updateTtl(cacheName, cacheKey, 1000 * second);
  if (result instanceof CacheUpdateTtl.Set) {
    console.log(`${cacheKey} update ttl ${second}s`);
  } else if (result instanceof CacheUpdateTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  }
}

async function momento_increase_ttl(cache_client, cacheName, cacheKey, duration) {
  const result = await cache_client.increaseTtl(cacheName, cacheKey, 1000 * duration);
  if (result instanceof CacheIncreaseTtl.Set) {
    console.log(`${cacheKey} increase ttl ${duration}s`);
  } else if (result instanceof CacheIncreaseTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  } else if (result instanceof CacheIncreaseTtl.Error) {
    console.log(`increase error ${result.errorCode()}`);
  }
}

export default function main() {

  const cache_client = new CacheClient({
    configuration: Configurations.Laptop.v1(),
    defaultTtlSeconds: 60,
    credentialProvider: CredentialProvider.fromEnvironmentVariable({
      environmentVariableName: 'MOMENTO_API_KEY'
    })
  });

  const cacheName = 'test_ttl_cache';
  const cacheKey = 'sample';

  momento_create_cache(cache_client, cacheName, cacheKey);
  momento_set_data(cache_client, cacheName, cacheKey, 'data');
  momento_update_ttl(cache_client, cacheName, cacheKey, 70);
  momento_increase_ttl(cache_client, cacheName, cacheKey, 150);
}

main();

DecreaseTtl

指定された数値でTTLの値を減算します。

import { CacheClient, CredentialProvider, Configurations, CreateCache, CacheSet, CacheUpdateTtl, CacheIncreaseTtl, CacheDecreaseTtl } from '@gomomento/sdk';

async function momento_create_cache(cache_client, cache_name) {
  const result = await cache_client.createCache(cache_name);
  if (result instanceof CreateCache.Success) {
    console.log(`Cache ${cache_name} created`);
  } else if (result instanceof CreateCache.AlreadyExists) {
    console.log(`Cache ${cache_name} already exists`);
  } else if (result instanceof CreateCache.Error) {
    throw new Error(
      `An error occurred while attempting to create cache ${cache_name}: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_set_data(cache_client, cache_name, key_name, key_value) {
  const result = await cache_client.set(cache_name, key_name, key_value);
  if (result instanceof CacheSet.Success) {
    console.log(`Key ${key_name} stored successfully`);
  } else if (result instanceof CacheSet.Error) {
    throw new Error(
      `An error occurred while attempting to store key 'test-key' in cache cache_name: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_update_ttl(cache_client, cacheName, cacheKey, second) {
  const result = await cache_client.updateTtl(cacheName, cacheKey, 1000 * second);
  if (result instanceof CacheUpdateTtl.Set) {
    console.log(`${cacheKey} update ttl ${second}s`);
  } else if (result instanceof CacheUpdateTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  }
}

async function momento_increase_ttl(cache_client, cacheName, cacheKey, duration) {
  const result = await cache_client.increaseTtl(cacheName, cacheKey, 1000 * duration);
  if (result instanceof CacheIncreaseTtl.Set) {
    console.log(`${cacheKey} increase ttl ${duration}s`);
  } else if (result instanceof CacheIncreaseTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  } else if (result instanceof CacheIncreaseTtl.Error) {
    console.log(`increase error ${result.errorCode()}`);
  }
}

async function momento_decrease_ttl(cache_client, cacheName, cacheKey, duration) {
  const result = await cache_client.decreaseTtl(cacheName, cacheKey, 1000 * duration);
  if (result instanceof CacheDecreaseTtl.Set) {
    console.log(`${cacheKey} decrease ttl ${duration}s`);
  } else if (result instanceof CacheDecreaseTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  } else if (result instanceof CacheDecreaseTtl.Error) {
    console.log(`increase error ${result.errorCode()}`);
  }
}

export default function main() {

  const cache_client = new CacheClient({
    configuration: Configurations.Laptop.v1(),
    defaultTtlSeconds: 60,
    credentialProvider: CredentialProvider.fromEnvironmentVariable({
      environmentVariableName: 'MOMENTO_API_KEY'
    })
  });

  const cacheName = 'test_ttl_cache';
  const cacheKey = 'sample';

  momento_create_cache(cache_client, cacheName, cacheKey);
  momento_set_data(cache_client, cacheName, cacheKey, 'data');
  momento_update_ttl(cache_client, cacheName, cacheKey, 70);
  momento_increase_ttl(cache_client, cacheName, cacheKey, 150);
  momento_decrease_ttl(cache_client, cacheName, cacheKey, 60);
}

main();

ItemGetTtl

指定されたキャッシュおよびキーの名前でTTLの値を取得します。

import { CacheClient, CredentialProvider, Configurations, CreateCache, CacheSet, CacheUpdateTtl, CacheIncreaseTtl, CacheDecreaseTtl, CacheItemGetTtl } from '@gomomento/sdk';

async function momento_create_cache(cache_client, cache_name) {
  const result = await cache_client.createCache(cache_name);
  if (result instanceof CreateCache.Success) {
    console.log(`Cache ${cache_name} created`);
  } else if (result instanceof CreateCache.AlreadyExists) {
    console.log(`Cache ${cache_name} already exists`);
  } else if (result instanceof CreateCache.Error) {
    throw new Error(
      `An error occurred while attempting to create cache ${cache_name}: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_set_data(cache_client, cache_name, key_name, key_value) {
  const result = await cache_client.set(cache_name, key_name, key_value);
  if (result instanceof CacheSet.Success) {
    console.log(`Key ${key_name} stored successfully`);
  } else if (result instanceof CacheSet.Error) {
    throw new Error(
      `An error occurred while attempting to store key ${key_name} in cache cache_name: ${result.errorCode()}: ${result.toString()}`
    );
  }
}

async function momento_update_ttl(cache_client, cacheName, cacheKey, second) {
  const result = await cache_client.updateTtl(cacheName, cacheKey, 1000 * second);
  if (result instanceof CacheUpdateTtl.Set) {
    console.log(`${cacheKey} update ttl ${second}s`);
  } else if (result instanceof CacheUpdateTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  }
}

async function momento_increase_ttl(cache_client, cacheName, cacheKey, duration) {
  const result = await cache_client.increaseTtl(cacheName, cacheKey, 1000 * duration);
  if (result instanceof CacheIncreaseTtl.Set) {
    console.log(`${cacheKey} increase ttl ${duration}s`);
  } else if (result instanceof CacheIncreaseTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  } else if (result instanceof CacheIncreaseTtl.Error) {
    console.log(`increase error ${result.errorCode()}`);
  }
}

async function momento_decrease_ttl(cache_client, cacheName, cacheKey, duration) {
  const result = await cache_client.decreaseTtl(cacheName, cacheKey, 1000 * duration);
  if (result instanceof CacheDecreaseTtl.Set) {
    console.log(`${cacheKey} decrease ttl ${duration}s`);
  } else if (result instanceof CacheDecreaseTtl.Miss) {
    console.log(`${cacheKey} cache Miss`);
  } else if (result instanceof CacheDecreaseTtl.Error) {
    console.log(`increase error ${result.errorCode()}`);
  }
}

async function momento_item_get_ttl(cache_client, cacheName, cacheKey) {
  const result = await cache_client.itemGetTtl(cacheName, cacheKey);
  if (result instanceof CacheItemGetTtl.Hit) {
    console.log(`ttl: ${result.remainingTtlMillis() / 1000}`);
  } else if (result instanceof CacheItemGetTtl.Miss) {
    console.log('none ttl');
  } else if (result instanceof CacheItemGetTtl.Error) {
    console.log('error');
  }
}

export default function main() {

  const cache_client = new CacheClient({
    configuration: Configurations.Laptop.v1(),
    defaultTtlSeconds: 60,
    credentialProvider: CredentialProvider.fromEnvironmentVariable({
      environmentVariableName: 'MOMENTO_API_KEY'
    })
  });

  const cacheName = 'test_ttl_cache';
  const cacheKey = 'sample';

  momento_create_cache(cache_client, cacheName, cacheKey);
  momento_set_data(cache_client, cacheName, cacheKey, 'data');

  momento_update_ttl(cache_client, cacheName, cacheKey, 70);
  momento_item_get_ttl(cache_client, cacheName, cacheKey);

  momento_increase_ttl(cache_client, cacheName, cacheKey, 150);
  momento_item_get_ttl(cache_client, cacheName, cacheKey);

  momento_decrease_ttl(cache_client, cacheName, cacheKey, 60);
  momento_item_get_ttl(cache_client, cacheName, cacheKey);
}

main();

おわり

Discussion