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

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.

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.