キーバリューストア

store モジュールは、必要に応じて TTL を指定できるキーバリューストレージを提供します。キャッシュデータ、セッション、その他の一時的な状態を保持できます。

このページは API リファレンスです。スニペットでは、構成済みのストア、後述する権限、アプリケーションが提供する owner や new_value などの値を前提としています。取得後のスニペットは既存の有効な cache ハンドルを使用するため、単独で実行できる関数ではありません。

ストアの構成については、ストアを参照してください。

ロード

local store = require("store")

ストアの取得

レジストリIDでストアリソースを取得:

local cache, err = store.get("app:cache")
if err then
    return nil, err
end

local _, set_err = cache:set("user:123", {name = "Alice"}, 3600)
if set_err then
    cache:release()
    return nil, set_err
end

local user, get_err = cache:get("user:123")

cache:release()
if get_err then return nil, get_err end
return user
パラメータ 型 説明
id string ストアリソースID

戻り値: Store, error

値の保存

オプションのTTL付きで値を保存:

-- Simple set
local _, err = cache:set("user:123:name", "Alice")
if err then return nil, err end

-- Set with TTL (expires in 300 seconds)
local ok, ttl_err = cache:set("session:abc", {user_id = 123, role = "admin"}, 300)
if ttl_err then return nil, ttl_err end
return ok
パラメータ 型 説明
key string キー
value any 値(テーブル、文字列、数値、ブール値)
ttl number TTL(秒)(オプション、0 = 期限なし)

戻り値: boolean, error

値の取得

キーで値を取得:

local errors = require("errors")

local user, err = cache:get("user:123")
if err then
    if err:kind() == errors.NOT_FOUND then
        return nil -- key missing or expired
    end
    return nil, err
end
return user
パラメータ 型 説明
key string 取得するキー

戻り値: any, error

キーが存在しないか期限切れの場合はnilとerrors.NOT_FOUNDエラーを返す。

存在確認

取得せずにキーが存在するか確認:

if cache:has("lock:" .. resource_id) then
    return nil, errors.new({ kind = errors.CONFLICT, message = "Resource is locked" })
end
パラメータ 型 説明
key string 確認するキー

戻り値: boolean, error

キーの削除

ストアからキーを削除:

local deleted, err = cache:delete("session:" .. session_id)
if err then return nil, err end
return deleted
パラメータ 型 説明
key string 削除するキー

戻り値: boolean, error

削除された場合はtrue、キーが存在しなかった場合はfalseを返す。

エントリメタデータの読み取り

entry は値と、その楽観的並行性制御に使われる不透明なバージョン文字列 version を返します:

local e, err = cache:entry("user:123")
if err then return nil, err end
if e then
    print(e.key, e.value, e.version)
end
パラメータ 型 説明
key string 読み取るキー

戻り値: Entry, error — {key: string, value: any, version: string}

キーの一覧

エントリを決定的なキー順でページング付きで一覧します:

local page, err = cache:list({ prefix = "session:", limit = 100 })
if err then return nil, err end
for _, e in ipairs(page.items) do
    print(e.key, e.value)
end

-- next page
if page.has_more then
    local next_page, next_err = cache:list({ prefix = "session:", after = page.cursor })
    if next_err then return nil, next_err end
    page = next_page
end
オプション 型 説明
prefix string このプレフィックスを持つキーのみ
after string このカーソル以降から継続(前のページから)
limit integer ページあたりの最大アイテム数

戻り値: Page, error — {items: Entry[], cursor: string, has_more: boolean}

条件付き書き込み

put は値を書き込み、新しい Entry を返します。オプションで楽観的並行性制御が可能です:

local errors = require("errors")

-- create only if the key does not exist
local e, err = cache:put("lock:job-1", owner, { only_if_absent = true })
if err and err:kind() == errors.ALREADY_EXISTS then
    -- 他の誰かが保持している
end

-- compare-and-set: write only if the version still matches
local cur, read_err = cache:entry("config")
if read_err then return nil, read_err end
local e2, err2 = cache:put("config", new_value, { if_version = cur.version })
if err2 and err2:kind() == errors.CONFLICT then
    -- 並行ライターが変更した。再読み取りして再試行
end
オプション 型 説明
ttl number TTL(秒)
only_if_absent boolean キーが存在しない場合のみ書き込み
if_version string 現在のバージョンが一致する場合のみ書き込み

only_if_absent と if_version は相互に排他的です。

戻り値: Entry, error

条件付き書き込みには info().conditional_put が true のストアが必要です(メモリストアと store.kv.raft ストア)。store.kv.crdt と store.sql では errors.INVALID エラーを返します。条件付き書き込みが必要な場合は store.kv.raft を使用してください。

ストア機能

info はバックエンドとそのサポート内容を報告します。これによりコードはバインドされたストアに適応できます:

local info, err = cache:info()
if err then return nil, err end
-- info.backend      -> one of store.backend.* (e.g. "kv.raft")
-- info.consistency  -> one of store.consistency.* (e.g. "linearizable")
-- info.durable / info.list / info.versioned / info.conditional_put / info.ttl  (booleans)

戻り値: Info, error — {id, backend, consistency, durable, list, versioned, conditional_put, ttl}

定数

定数 値
store.backend MEMORY, SQL, KV_RAFT, KV_CRDT, UNKNOWN
store.consistency LINEARIZABLE, EVENTUAL, LOCAL, UNKNOWN
local info, err = cache:info()
if err then return nil, err end
if info.consistency == store.consistency.LINEARIZABLE then
    -- safe to use compare-and-set
end

ストアメソッド

メソッド 戻り値 説明
get(key) any, error キーで値を取得
entry(key) Entry, error バージョンメタデータ付きで値を取得
set(key, value, ttl?) boolean, error オプションのTTL付きで値を保存
put(key, value, opts?) Entry, error 条件付き/バージョン管理付き書き込み、新しいエントリを返す
list(opts?) Page, error キー順のページング付き一覧
has(key) boolean, error キーが存在するか確認
delete(key) boolean, error キーを削除
info() Info, error バックエンド、整合性、機能フラグ
release() boolean ストアをプールに戻す

権限

ストア操作はセキュリティポリシー評価の対象。

アクション リソース 属性 説明
store.get Store ID - ストアリソースを取得
store.info Store ID - ストアのケーパビリティを調べる
store.key.get Store ID key キー値を読み取り(entry も同様)
store.key.set Store ID key キー値を書き込み(put も同様)
store.key.delete Store ID key キーを削除
store.key.has Store ID key キーの存在を確認
store.key.list Store ID prefix エントリを一覧

エラー

store.get() とストアハンドルのすべてのメソッド(get、entry、set、put、list、has、delete、info)は構造化エラーを返します(err:kind() を使用)。ただし store.get、get、set、has、delete での権限拒否は、エラーを返す代わりに Lua エラーとして送出されます。

条件 種別 再試行可能
リソースIDが空 errors.INVALID no
リソースが見つからない errors.INTERNAL no
ストアが解放済み errors.INVALID no
権限拒否(entry、put、list、info) errors.PERMISSION_DENIED no
only_if_absent でキーが存在する errors.ALREADY_EXISTS no
if_version 不一致 errors.CONFLICT yes
サポートのないストアでの条件付き書き込み errors.INVALID no

エラーの処理についてはエラー処理を参照。

エラーの処理については、エラー処理を参照してください。