Zum Inhalt springen

Key-Value-Speicher

Schneller Key-Value-Speicher mit TTL-Unterstützung. Ideal für Caching, Sessions und temporäre Zustände.

Für Speicherkonfiguration siehe Store.

local store = require("store")

Holen Sie eine Store-Ressource anhand der Registry-ID:

local cache, err = store.get("app:cache")
if err then
return nil, err
end
cache:set("user:123", {name = "Alice"}, 3600)
local user = cache:get("user:123")
cache:release()
ParameterTypBeschreibung
idstringStore-Ressourcen-ID

Gibt zurück: Store, error

Speichern Sie einen Wert mit optionaler TTL:

local cache = store.get("app:cache")
-- Einfaches Setzen
cache:set("user:123:name", "Alice")
-- Setzen mit TTL (läuft in 300 Sekunden ab)
cache:set("session:abc", {user_id = 123, role = "admin"}, 300)
ParameterTypBeschreibung
keystringSchlüssel
valueanyWert (Tables, Strings, Zahlen, Booleans)
ttlnumberTTL in Sekunden (optional, 0 = kein Ablauf)

Gibt zurück: boolean, error

Holen Sie einen Wert anhand des Schlüssels:

local user = cache:get("user:123")
if not user then
-- Schlüssel nicht gefunden oder abgelaufen
end
ParameterTypBeschreibung
keystringAbzurufender Schlüssel

Gibt zurück: any, error

Gibt nil zurück, wenn der Schlüssel nicht existiert.

Prüfen Sie, ob ein Schlüssel existiert, ohne ihn abzurufen:

if cache:has("lock:" .. resource_id) then
return nil, errors.new("CONFLICT", "Resource is locked")
end
ParameterTypBeschreibung
keystringZu prüfender Schlüssel

Gibt zurück: boolean, error

Entfernen Sie einen Schlüssel aus dem Store:

cache:delete("session:" .. session_id)
ParameterTypBeschreibung
keystringZu löschender Schlüssel

Gibt zurück: boolean, error

Gibt true zurück wenn gelöscht, false wenn Schlüssel nicht existierte.

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 e then
print(e.key, e.value, e.version)
end
ParameterTypBeschreibung
keystringZu lesender Schlüssel

Gibt zurück: Entry, error{key: string, value: any, version: string}

Einträge in deterministischer Schlüsselreihenfolge auflisten, mit Paging:

local page, err = cache:list({ prefix = "session:", limit = 100 })
for _, e in ipairs(page.items) do
print(e.key, e.value)
end
-- nächste Seite
if page.has_more then
page = cache:list({ prefix = "session:", after = page.cursor })
end
OptionTypBeschreibung
prefixstringNur Schlüssel mit diesem Präfix
afterstringNach diesem Cursor fortsetzen (aus einer vorherigen Seite)
limitintegerMaximale Anzahl an Elementen pro Seite

Gibt zurück: Page, error{items: Entry[], cursor: string, has_more: boolean}

put schreibt einen Wert und gibt seinen neuen Entry zurück. Optionen ermöglichen optimistische Nebenläufigkeit:

-- nur erstellen, wenn der Schlüssel nicht existiert
local e, err = cache:put("lock:job-1", owner, { only_if_absent = true })
if err and err:kind() == "ALREADY_EXISTS" then
-- jemand anderes hält ihn
end
-- compare-and-set: nur schreiben, wenn die Version noch übereinstimmt
local cur = cache:entry("config")
local e2, err2 = cache:put("config", new_value, { if_version = cur.version })
if err2 and err2:kind() == "CONFLICT" then
-- ein gleichzeitiger Schreiber hat ihn geändert; erneut lesen und wiederholen
end
OptionTypBeschreibung
ttlnumberTTL in Sekunden
only_if_absentbooleanNur schreiben, wenn der Schlüssel nicht existiert
if_versionstringNur schreiben, wenn die aktuelle Version übereinstimmt

only_if_absent und if_version schließen sich gegenseitig aus.

Gibt zurück: Entry, error

Bedingte Schreibvorgänge erfordern einen Store, dessen 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.

info meldet das Backend und was es unterstützt, sodass Code sich an den jeweils gebundenen Store anpassen kann:

local info = cache:info()
-- info.backend -> einer von store.backend.* (z. B. "kv.raft")
-- info.consistency -> einer von store.consistency.* (z. B. "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}

KonstanteWerte
store.backendMEMORY, SQL, KV_RAFT, KV_CRDT, UNKNOWN
store.consistencyLINEARIZABLE, EVENTUAL, LOCAL, UNKNOWN
if cache:info().consistency == store.consistency.LINEARIZABLE then
-- sicher, compare-and-set zu verwenden
end
MethodeGibt zurückBeschreibung
get(key)any, errorWert nach Schlüssel abrufen
entry(key)Entry, errorWert mit Versions-Metadaten abrufen
set(key, value, ttl?)boolean, errorWert mit optionaler TTL speichern
put(key, value, opts?)Entry, errorBedingter/versionierter Schreibvorgang, gibt den neuen Eintrag zurück
list(opts?)Page, errorPaginierte Auflistung in Schlüsselreihenfolge
has(key)boolean, errorPrüfen ob Schlüssel existiert
delete(key)boolean, errorSchlüssel entfernen
info()Info, errorBackend, Konsistenz und Fähigkeits-Flags
release()booleanStore an Pool zurückgeben

Store-Operationen unterliegen der Sicherheitsrichtlinienauswertung.

AktionRessourceAttributeBeschreibung
store.getStore-ID-Store-Ressource abrufen
store.key.getStore-IDkeySchlüsselwert lesen
store.key.setStore-IDkeySchlüsselwert schreiben
store.key.deleteStore-IDkeySchlüssel löschen
store.key.hasStore-IDkeySchlüsselexistenz prüfen

store.get() und alle Methoden des Store-Handles (get, set, has, delete) geben strukturierte Fehler zurück (verwenden Sie err:kind()).

BedingungArtWiederholbar
Leere Ressourcen-IDerrors.INVALIDnein
Ressource nicht gefundenerrors.NOT_FOUNDnein
Store freigegebenerrors.INVALIDnein
Berechtigung verweigerterrors.PERMISSION_DENIEDnein
only_if_absent und Schlüssel existierterrors.ALREADY_EXISTSnein
if_version-Abweichungerrors.CONFLICTja
Bedingter Schreibvorgang auf einem Store ohne Unterstützungerrors.INVALIDnein

Siehe Fehlerbehandlung für die Arbeit mit Fehlern.