Zum Inhalt springen

Store (Key-Value)

Key-Value-Stores mit TTL-Unterstützung: In-Memory, SQL-basiert und cluster-repliziert (Raft und CRDT).

KindBeschreibung
store.memoryIn-Memory-Store mit automatischer Bereinigung
store.sqlSQL-basierter Store mit Persistenz
store.kv.raftCluster-replizierter, stark konsistenter KV auf dem geteilten Raft
store.kv.crdtCluster-replizierter, letztlich konsistenter KV über Gossip (CRDT)
- name: sessions
kind: store.memory
max_size: 10000
cleanup_interval: "5m"
lifecycle:
auto_start: true
FeldTypStandardBeschreibung
max_sizeint10000Maximale Einträge (0 = unbegrenzt)
cleanup_intervalduration5mBereinigungs-Intervall für abgelaufene Einträge

Wenn max_size erreicht ist, werden neue Einträge abgelehnt. Daten gehen beim Neustart verloren.

- name: cache
kind: store.sql
database: app:postgres
table_name: kv_store
cleanup_interval: "10m"
lifecycle:
auto_start: true
FeldTypStandardBeschreibung
databasereferenceerforderlichDatenbank-Entry-Referenz
table_namestringerforderlichTabellenname für Speicherung
id_column_namestringkeySpalte für Schlüssel
payload_column_namestringvalueSpalte für Werte
expire_column_namestringexpires_atSpalte für Ablauf
cleanup_intervalduration0Bereinigungs-Intervall für abgelaufene Einträge

Spaltennamen werden gegen SQL-Injection validiert. Erstellen Sie die Tabelle vor der Verwendung:

CREATE TABLE kv_store (
key VARCHAR(255) PRIMARY KEY,
value BYTEA NOT NULL,
expires_at BIGINT
);
CREATE INDEX idx_expires_at ON kv_store(expires_at) WHERE expires_at IS NOT NULL;

store.kv.raft und store.kv.crdt replizieren Key-Value-Daten über Cluster-Knoten hinweg. Beide erfordern aktiviertes Clustering und nutzen dieselbe Store-Modul-Lua-API. Jeder Eintrag ist eine namespace-bezogene Sicht auf eine knotenweite Engine; namespace isoliert die Schlüssel dieses Eintrags und muss ^[a-z][a-z0-9._-]*$ entsprechen (darf nicht mit _ beginnen).

- name: deployments
kind: store.kv.raft
namespace: deploy
FeldTypErforderlichBeschreibung
namespacestringJaSchlüssel-Namespace in der geteilten Engine

Schreibvorgänge werden über das geteilte Raft vorgeschlagen (Follower leiten an den Leader weiter); Lesevorgänge sind linearisierbar. Bedingte Schreibvorgänge (put mit only_if_absent/if_version) werden unterstützt. Der Raft-Zustand ist standardmäßig fs-dauerhaft unter cluster.raft.data_dir (Standard ~/.wippy/store); siehe Konfiguration.

- name: sessions
kind: store.kv.crdt
namespace: sess
durable: false
FeldTypErforderlichStandardBeschreibung
namespacestringJa-Schlüssel-Namespace
durableboolNeinfalsefs-Snapshots persistieren, damit der Namespace einen Neustart des gesamten Clusters überlebt

Schreibvorgänge mutieren den lokalen Zustand und verbreiten sich über Gossip; widersprüchliche gleichzeitige Schreibvorgänge konvergieren per Last-Writer-Wins. Lesevorgänge sind lokal. Bedingte Schreibvorgänge werden nicht unterstützt. Mit durable: false ist der Store im Speicher und rekonstruiert sich aus Peers; mit durable: true erstellt er Snapshots unter <data_dir>/_sys/kvcrdt.

data_dir ist knotenebene (cluster.raft.data_dir), nicht pro Eintrag. Der geteilte Raft-Zustand und dauerhafte CRDT-Snapshots liegen unter <data_dir>/_sys/.

Beide Stores unterstützen Time-to-Live. Abgelaufene Einträge bleiben kurz bestehen, bis die Bereinigung im Intervall cleanup_interval läuft. Auf 0 setzen um automatische Bereinigung zu deaktivieren.

Siehe Store-Modul für Operationen: get, set, has, delete, sowie put, entry, list und info für versionierten und bedingten Zugriff.