キーバリューストア
キーバリューストア
Section titled “キーバリューストア”TTLサポート付きの高速キーバリューストレージ。キャッシュ、セッション、一時的な状態に最適。
ストア設定についてはストアを参照。
local store = require("store")ストアの取得
Section titled “ストアの取得”レジストリIDでストアリソースを取得:
local cache, err = store.get("app:cache")if err then return nil, errend
cache:set("user:123", {name = "Alice"}, 3600)local user = cache:get("user:123")
cache:release()| パラメータ | 型 | 説明 |
|---|---|---|
id | string | ストアリソースID |
戻り値: Store, error
オプションのTTL付きで値を保存:
local cache = store.get("app:cache")
-- シンプルなsetcache:set("user:123:name", "Alice")
-- TTL付きでset(300秒で期限切れ)cache:set("session:abc", {user_id = 123, role = "admin"}, 300)| パラメータ | 型 | 説明 |
|---|---|---|
key | string | キー |
value | any | 値(テーブル、文字列、数値、ブール値) |
ttl | number | TTL(秒)(オプション、0 = 期限なし) |
戻り値: boolean, error
キーで値を取得:
local user = cache:get("user:123")if not user then -- キーが見つからないか期限切れend| パラメータ | 型 | 説明 |
|---|---|---|
key | string | 取得するキー |
戻り値: any, error
キーが存在しない場合はnilを返す。
取得せずにキーが存在するか確認:
if cache:has("lock:" .. resource_id) then return nil, errors.new("CONFLICT", "Resource is locked")end| パラメータ | 型 | 説明 |
|---|---|---|
key | string | 確認するキー |
戻り値: boolean, error
ストアからキーを削除:
cache:delete("session:" .. session_id)| パラメータ | 型 | 説明 |
|---|---|---|
key | string | 削除するキー |
戻り値: boolean, error
削除された場合はtrue、キーが存在しなかった場合はfalseを返す。
エントリメタデータの読み取り
Section titled “エントリメタデータの読み取り”entry は値とその version を返します。version は楽観的並行性制御に使われる不透明な文字列です:
local e, err = cache:entry("user:123")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 })for _, e in ipairs(page.items) do print(e.key, e.value)end
-- 次のページif page.has_more then page = cache:list({ prefix = "session:", after = page.cursor })end| オプション | 型 | 説明 |
|---|---|---|
prefix | string | このプレフィックスを持つキーのみ |
after | string | このカーソル以降から継続(前のページから) |
limit | integer | ページあたりの最大アイテム数 |
戻り値: Page, error — {items: Entry[], cursor: string, has_more: boolean}
条件付き書き込み
Section titled “条件付き書き込み”put は値を書き込み、新しい Entry を返します。オプションで楽観的並行性制御が可能です:
-- キーが存在しない場合のみ作成local e, err = cache:put("lock:job-1", owner, { only_if_absent = true })if err and err:kind() == "ALREADY_EXISTS" then -- 他の誰かが保持しているend
-- compare-and-set: バージョンがまだ一致する場合のみ書き込みlocal cur = cache:entry("config")local e2, err2 = cache:put("config", new_value, { if_version = cur.version })if err2 and err2:kind() == "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 = cache:info()-- info.backend -> store.backend.* のいずれか(例: "kv.raft")-- info.consistency -> store.consistency.* のいずれか(例: "linearizable")-- info.durable / info.list / info.versioned / info.conditional_put / info.ttl (ブール値)戻り値: 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 |
if cache:info().consistency == store.consistency.LINEARIZABLE then -- compare-and-set を安全に使用できるendストアメソッド
Section titled “ストアメソッド”| メソッド | 戻り値 | 説明 |
|---|---|---|
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.key.get | Store ID | key | キー値を読み取り |
store.key.set | Store ID | key | キー値を書き込み |
store.key.delete | Store ID | key | キーを削除 |
store.key.has | Store ID | key | キーの存在を確認 |
store.get() とストアハンドルのすべてのメソッド(get、set、has、delete)は構造化エラーを返します(err:kind() を使用)。
| 条件 | 種別 | 再試行可能 |
|---|---|---|
| リソースIDが空 | errors.INVALID | no |
| リソースが見つからない | errors.NOT_FOUND | no |
| ストアが解放済み | errors.INVALID | no |
| 権限拒否 | errors.PERMISSION_DENIED | no |
only_if_absent でキーが存在する | errors.ALREADY_EXISTS | no |
if_version 不一致 | errors.CONFLICT | yes |
| サポートのないストアでの条件付き書き込み | errors.INVALID | no |
エラーの処理についてはエラー処理を参照。