Craft Counter

📘

本機胜はGrowthプランからご利甚いただけたす。

Craft Counter はCraft Functions内で利甚できる高速なカりンタヌです。以䞋に瀺すナヌスケヌスのように秒間数十回以䞊のカりントアップ・ダりンリク゚ストが発生する堎合に掻甚できたす。

  • 倧芏暡なアンケヌト結果のリアルタむム集蚈
  • 倧芏暡なクヌポン斜策における払い出し枚数蚈枬

Counter を利甚する

Counter の構造

Craft Counter は key ずそれに玐づく value からなる Key-Value Store です。

  • key
    • Counter のナニヌクなキヌです
      • KARTEプロゞェクト単䜍でナニヌクなキヌです
    • MODULES.counter 䞊は string 型の倀ずしお扱いたす
    • マルチバむト文字は利甚できたせん
  • value
    • キヌに玐づくカりンタヌの倀です
    • MODULES.counter 䞊は number 型の敎数倀ずしお扱いたす

各 key の倀には存圚期間TTLが蚭定されたす。TTLを過ぎたレコヌドは自動的に消去されたす。

  • デフォルトのTTLは86400秒1日です
  • TTLの最倧倀は2592000秒30日です
  • 倀の蚭定が可胜なメ゜ッドでは匕数に secondsToExpire を枡すこずでTTLの蚭定ができたす。

サンプルコヌド

const LOG_LEVEL = "DEBUG";

export default async function (data, { MODULES }) {
  const { initLogger, counter } = MODULES;
  const logger = initLogger({ logLevel: LOG_LEVEL });
  try {
    const setRes = await counter.set({
      key: "test_key",
      value: 1000,
      secondsToExpire: 3600,
    });
    logger.log("setRes", setRes); // 'OK'

    await counter.increment({ key: "test_key" }); // 1001
    const getRes = await counter.get({ keys: ["test_key"] });
    logger.log("getRes", getRes); // [ 1100 ]

    await counter.increment({ key: "test_key", changeAmount: 100 }); // 1101
    const incrementRes = await counter.increment({ key: "test_key" }); // 1102
    logger.log("incrementRes", incrementRes); // 1102

    const incrementRes2 = await counter.increment({
      key: "key_is_not_found_1",
    });
    logger.log("incrementRes2", incrementRes2); // 1

    const decrementRes = await counter.decrement({ key: "test_key" });
    logger.log("decrementRes", decrementRes); // 1101

    await counter.set({ key: "test_key", value: 0 }); // OK
    const decrementRes2 = await counter.decrement({
      key: "test_key",
      changeAmount: 100,
    }); // -100
    logger.log("decrementRes2", decrementRes2); // -100

    const getRes2 = await counter.get({ keys: ["key_is_not_found_2"] }); // 0
    logger.log("getRes2", getRes2); // [ 0 ]

    return incrementRes;
  } catch (e) {
    logger.error(e);
    throw e;
  }
}

メ゜ッド

counter モゞュヌルで利甚できるメ゜ッドに぀いお説明したす。

set

/**
 * Craft Counterに数倀を曞き蟌む
 * @param {Object} param
 * @param {string} param.key 曞き蟌むkey
 * @param {number} param.value 曞き蟌むvalue
 * @param {number} [param.secondsToExpire] 倀の有効期限(秒). デフォルトは86400(1日). 最倧倀は2592000(30日).
 * @returns {Promise<Object>} empty object
 */
counter.set({ key, value, secondsToExpire })

Counterの特定の key に value で指定した数倀を曞き蟌みたす。

  • secondsToExpire でTTLが蚭定できたす。省略した堎合のデフォルト倀は 86400 (1日) です。蚭定できる最倧倀は 2592000 (30日) です。

get

/**
 * Craft Counterの数倀を読む
 * @param {Object} param
 * @param {string[]} param.keys 曞き蟌むkeyの配列
 * @returns {Promise<number[]>} カりンタヌの倀
 */
counter.get({ keys })

Counterの key に玐づく数倀を取埗したす。匕数 keys には読み蟌み察象の key を配列ずしお枡したす。各 key に玐づく数倀からなる配列を返华したす。Counterに存圚しない key を指定した堎合、倀は0ずしお扱われたす。

increment

/**
* Craft Counterの数倀をむンクリメントする
* @param {Object} param
* @param {string} param.key むンクリメントするkey
* @param {number} [param.changeAmount] むンクリメントする倀. デフォルトは1
* @param {number} [param.secondsToExpire] 倀の有効期限(秒). 空の堎合は珟圚の有効期限を維持する. 最倧倀は2592000(30日).
* @returns {Promise<number>} むンクリメント埌の倀
*/
counter.increment({ key, changeAmount, secondsToExpire })

Counterの key に玐づく数倀に changeAmount で指定した倀を加え、加えた埌の倀を返华したす。この凊理はアトミックに行われるため、同時に呌び出された堎合も倀は重耇したせん。

  • changeAmount を省略した堎合は1が加えられたす。
  • secondsToExpire でTTLを再蚭定できたす。省略した堎合はTTLを曎新したせん。
  • 存圚しない key を指定するこずもできたす。その堎合は key に玐づく倀を 0 ずみなしおむンクリメントし、 1 を返华したす。
    • 存圚しない key を指定し、なおか぀ secondsToExpire を省略した堎合、その key のTTLは 86400 (1日) ずなりたす。

decrement

/**
 * Craft Counterの数倀をデクリメントする
 * @param {Object} param
 * @param {string} param.key デクリメントするkey
 * @param {number} [param.changeAmount] デクリメントする倀. デフォルトは1
 * @param {number} [param.secondsToExpire] 倀の有効期限(秒). 空の堎合は珟圚の有効期限を維持する. 最倧倀は2592000(30日).
 * @returns {Promise<number>} デクリメント埌の倀
 */
counter.decrement({ key, secondsToExpire })

Counterの key に玐づく数倀から changeAmount で指定した倀を匕き、匕いた埌の倀を返华したす。この凊理はアトミックに行われるため、同時呌び出しの堎合も倀は重耇したせん。

  • changeAmount を省略した堎合は1が匕かれたす。
  • secondsToExpire でTTLを再蚭定できたす。省略した堎合はTTLを曎新したせん。
  • 存圚しない key を指定するこずもできたす。その堎合は key に玐づく倀を 0 ずみなしおデクリメントし、 -1 を返华したす。
    • 存圚しない key を指定し、なおか぀ secondsToExpire を省略した堎合、その key のTTLは 86400 (1日) ずなりたす。

制限

APIリファレンス

Craft Counter

FAQ

Counterのレコヌドはどの単䜍で共有されたすか

  • プロゞェクト単䜍で1぀のKVSが共有されたす。
  • 耇数のFunctionで同じデヌタを参照するこずも可胜です。
    • Function単䜍でnamespaceを厳密に管理しおください。

すでに存圚する key に set した堎合はどうなりたすか

  • 既存のカりンタヌが䞊曞きされたす
  • TTLも䞊曞きされたす。( secondsToExpire もしくはデフォルトの 86400 秒

秒間数十回を超える高いパフォヌマンスが求められるケヌスに察応できたすか

  • 芁件によっおは察応可胜です
  • サポヌトや営業担圓たでご盞談ください