Key-Value-Speicher
Das Modul store stellt Key-Value-Speicher mit optionalen TTLs bereit. Es eignet sich für Cache-Daten, Sitzungen und andere temporäre Zustände.
Diese Seite ist eine API-Referenz. Ihre Ausschnitte setzen einen konfigurierten Store, die unten aufgeführten Berechtigungen und von der Anwendung bereitgestellte Werte wie owner oder new_value voraus. Ausschnitte nach dem Abrufen verwenden ein bereits vorhandenes, aktives cache-Handle und sind keine eigenständigen Funktionen.
Informationen zur Store-Konfiguration finden Sie unter Store.
Laden
local store = require("store")
Store abrufen
Rufen Sie eine Store-Ressource anhand ihrer Registry-ID ab:
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
| Parameter | Typ | Beschreibung |
|---|---|---|
id |
string | Store-Ressourcen-ID |
Gibt zurück: Store, error
Werte speichern
Speichern Sie einen Wert mit optionaler 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
| Parameter | Typ | Beschreibung |
|---|---|---|
key |
string | Schlüssel |
value |
any | Wert (Tables, Strings, Zahlen, Booleans) |
ttl |
number | TTL in Sekunden (optional, 0 = kein Ablauf) |
Gibt zurück: boolean, error
Werte abrufen
Holen Sie einen Wert anhand des Schlüssels:
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
| Parameter | Typ | Beschreibung |
|---|---|---|
key |
string | Abzurufender Schlüssel |
Gibt zurück: any, error
Gibt nil und einen errors.NOT_FOUND-Fehler zurück, wenn der Schlüssel nicht existiert oder abgelaufen ist.
Existenz prüfen
Prüfen Sie, ob ein Schlüssel existiert, ohne ihn abzurufen:
if cache:has("lock:" .. resource_id) then
return nil, errors.new({ kind = errors.CONFLICT, message = "Resource is locked" })
end
| Parameter | Typ | Beschreibung |
|---|---|---|
key |
string | Zu prüfender Schlüssel |
Gibt zurück: boolean, error
Schlüssel löschen
Entfernen Sie einen Schlüssel aus dem Store:
local deleted, err = cache:delete("session:" .. session_id)
if err then return nil, err end
return deleted
| Parameter | Typ | Beschreibung |
|---|---|---|
key |
string | Zu löschender Schlüssel |
Gibt zurück: boolean, error
Die Methode gibt true zurück, wenn sie den Schlüssel löscht, und false, wenn der Schlüssel nicht existiert.
Eintrags-Metadaten lesen
entry gibt den Wert zusammen mit seiner version zurück — einer opaken Zeichenkette, die für optimistische Nebenläufigkeit verwendet wird:
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
| Parameter | Typ | Beschreibung |
|---|---|---|
key |
string | Zu lesender Schlüssel |
Gibt zurück: Entry, error — {key: string, value: any, version: string}
Schlüssel auflisten
Listen Sie Einträge in deterministischer Schlüsselreihenfolge mit Seitennavigation auf:
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
| Option | Typ | Beschreibung |
|---|---|---|
prefix |
string | Nur Schlüssel mit diesem Präfix |
after |
string | Nach diesem Cursor fortsetzen (aus einer vorherigen Seite) |
limit |
integer | Maximale Anzahl an Elementen pro Seite |
Gibt zurück: Page, error — {items: Entry[], cursor: string, has_more: boolean}
Bedingte Schreibvorgänge
put schreibt einen Wert und gibt seinen neuen Entry zurück. Optionen ermöglichen optimistische Nebenläufigkeit:
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
-- jemand anderes hält ihn
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
-- ein gleichzeitiger Schreiber hat ihn geändert; erneut lesen und wiederholen
end
| Option | Typ | Beschreibung |
|---|---|---|
ttl |
number | TTL in Sekunden |
only_if_absent |
boolean | Nur schreiben, wenn der Schlüssel nicht existiert |
if_version |
string | Nur schreiben, wenn die aktuelle Version übereinstimmt |
only_if_absent und if_version schließen sich gegenseitig aus.
Gibt zurück: Entry, error
info().conditional_put true ist (die Stores Memory und store.kv.raft). Bei store.kv.crdt und store.sql geben sie einen errors.INVALID-Fehler zurück — verwenden Sie store.kv.raft, wenn Sie bedingte Schreibvorgänge benötigen.
Store-Fähigkeiten
info meldet das Backend und was es unterstützt, sodass Code sich an den jeweils gebundenen Store anpassen kann:
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)
Gibt zurück: Info, error — {id, backend, consistency, durable, list, versioned, conditional_put, ttl}
Konstanten
| Konstante | Werte |
|---|---|
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
Store-Methoden
| Methode | Gibt zurück | Beschreibung |
|---|---|---|
get(key) |
any, error |
Wert nach Schlüssel abrufen |
entry(key) |
Entry, error |
Wert mit Versions-Metadaten abrufen |
set(key, value, ttl?) |
boolean, error |
Wert mit optionaler TTL speichern |
put(key, value, opts?) |
Entry, error |
Bedingter/versionierter Schreibvorgang, gibt den neuen Eintrag zurück |
list(opts?) |
Page, error |
Paginierte Auflistung in Schlüsselreihenfolge |
has(key) |
boolean, error |
Prüfen ob Schlüssel existiert |
delete(key) |
boolean, error |
Schlüssel entfernen |
info() |
Info, error |
Backend, Konsistenz und Fähigkeits-Flags |
release() |
boolean |
Store an Pool zurückgeben |
Berechtigungen
Store-Operationen unterliegen der Auswertung der Sicherheitsrichtlinien.
| Aktion | Ressource | Attribute | Beschreibung |
|---|---|---|---|
store.get |
Store-ID | - | Store-Ressource abrufen |
store.info |
Store-ID | - | Store-Fähigkeiten inspizieren |
store.key.get |
Store-ID | key |
Schlüsselwert lesen (auch entry) |
store.key.set |
Store-ID | key |
Schlüsselwert schreiben (auch put) |
store.key.delete |
Store-ID | key |
Schlüssel löschen |
store.key.has |
Store-ID | key |
Schlüsselexistenz prüfen |
store.key.list |
Store-ID | prefix |
Einträge auflisten |
Fehler
store.get() und alle Methoden des Store-Handles (get, entry, set, put, list, has, delete, info) geben strukturierte Fehler zurück (verwenden Sie err:kind()), außer dass eine Berechtigungsverweigerung in store.get, get, set, has und delete stattdessen einen Lua-Fehler auslöst.
| Bedingung | Art | Wiederholbar |
|---|---|---|
| Leere Ressourcen-ID | errors.INVALID |
nein |
| Ressource nicht gefunden | errors.INTERNAL |
nein |
| Store freigegeben | errors.INVALID |
nein |
Berechtigung verweigert (entry, put, list, info) |
errors.PERMISSION_DENIED |
nein |
only_if_absent und Schlüssel existiert |
errors.ALREADY_EXISTS |
nein |
if_version-Abweichung |
errors.CONFLICT |
ja |
| Bedingter Schreibvorgang auf einem Store ohne Unterstützung | errors.INVALID |
nein |
Informationen zum Umgang mit Fehlern finden Sie unter Fehlerbehandlung.