Store (Clave-Valor)
Almacenes clave-valor con soporte TTL: en memoria, respaldados por SQL y replicados en cluster (Raft y CRDT).
Tipos de Entrada
| Tipo | Descripción |
|---|---|
store.memory |
Almacén en memoria con limpieza automática |
store.sql |
Almacén respaldado por SQL con persistencia |
store.kv.raft |
KV replicado en cluster, fuertemente consistente, sobre el Raft compartido |
store.kv.crdt |
KV replicado en cluster, eventualmente consistente, sobre gossip (CRDT) |
Almacén en Memoria
- name: sessions
kind: store.memory
max_size: 10000
cleanup_interval: "5m"
lifecycle:
auto_start: true
| Campo | Tipo | Por Defecto | Descripción |
|---|---|---|---|
max_size |
int | 10000 | Entradas máximas (0 = ilimitado) |
cleanup_interval |
duration | 5m | Intervalo de limpieza de entradas expiradas |
Cuando se alcanza max_size, se rechazan nuevas entradas. Los datos se pierden al reiniciar.
Almacén SQL
- name: cache
kind: store.sql
database: app:postgres
table_name: kv_store
cleanup_interval: "10m"
lifecycle:
auto_start: true
| Campo | Tipo | Por Defecto | Descripción |
|---|---|---|---|
database |
referencia | requerido | Referencia de entrada de base de datos |
table_name |
string | requerido | Nombre de tabla para almacenamiento |
id_column_name |
string | key | Columna para claves |
payload_column_name |
string | value | Columna para valores |
expire_column_name |
string | expires_at | Columna para expiración |
cleanup_interval |
duration | 0 | Intervalo de limpieza de entradas expiradas |
Los nombres de columna se validan contra inyección SQL. Cree la tabla antes de usar:
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;
Almacenes KV de Cluster {id=cluster-kv-stores}
store.kv.raft y store.kv.crdt replican datos clave-valor entre los nodos del cluster. Ambos requieren que el clustering esté habilitado y reutilizan la misma API Lua del Módulo Store. Cada entrada es una vista con namespace sobre un único motor a nivel de nodo; namespace aísla las claves de esta entrada y debe coincidir con ^[a-z][a-z0-9._-]*$ (no puede comenzar con _).
Raft (consistencia fuerte)
- name: deployments
kind: store.kv.raft
namespace: deploy
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
namespace |
string | Sí | Namespace de claves en el motor compartido |
Las escrituras se proponen a través del Raft compartido (los seguidores las reenvían al líder); las lecturas son linealizables. Se soportan escrituras condicionales (put con only_if_absent/if_version). El estado de Raft es durable en disco por defecto bajo cluster.raft.data_dir (por defecto ~/.wippy/store); ver Configuración.
CRDT (consistencia eventual)
- name: sessions
kind: store.kv.crdt
namespace: sess
durable: false
| Campo | Tipo | Requerido | Por Defecto | Descripción |
|---|---|---|---|---|
namespace |
string | Sí | - | Namespace de claves |
durable |
bool | No | false | Persiste snapshots en disco para que el namespace sobreviva a un reinicio completo del cluster |
Las escrituras mutan el estado local y se diseminan por gossip; las escrituras concurrentes en conflicto convergen mediante last-writer-wins. Las lecturas son locales. No se soportan escrituras condicionales. Con durable: false el almacén está en memoria y se reconstruye desde los peers; con durable: true toma snapshots en <data_dir>/_sys/kvcrdt.
data_dir es a nivel de nodo (cluster.raft.data_dir), no por entrada. El estado de Raft compartido y los snapshots durables de CRDT residen bajo <data_dir>/_sys/.
Comportamiento TTL
Ambos almacenes soportan tiempo de vida. Las entradas expiradas persisten brevemente hasta que la limpieza se ejecuta en cleanup_interval. Establezca a 0 para deshabilitar la limpieza automática.
API Lua
Consulte el Módulo Store para operaciones: get, set, has, delete, además de put, entry, list e info para acceso versionado y condicional.
Ver También
- Módulo Store - Referencia de la API Lua
- Base de Datos - Respaldo SQL para
store.sql