Pular para o conteúdo

Store (Chave-Valor)

Armazenamentos chave-valor com suporte a TTL: em memória, com backend SQL e replicados em cluster (Raft e CRDT).

TipoDescrição
store.memoryArmazenamento em memória com limpeza automática
store.sqlArmazenamento com backend SQL com persistência
store.kv.raftKV replicado em cluster, fortemente consistente, sobre o Raft compartilhado
store.kv.crdtKV replicado em cluster, eventualmente consistente, via gossip (CRDT)
- name: sessions
kind: store.memory
max_size: 10000
cleanup_interval: "5m"
lifecycle:
auto_start: true
CampoTipoPadrãoDescrição
max_sizeint10000Máximo de entradas (0 = ilimitado)
cleanup_intervalduration5mIntervalo de limpeza de entradas expiradas

Quando max_size é atingido, novas entradas são rejeitadas. Dados são perdidos ao reiniciar.

- name: cache
kind: store.sql
database: app:postgres
table_name: kv_store
cleanup_interval: "10m"
lifecycle:
auto_start: true
CampoTipoPadrãoDescrição
databasereferênciaobrigatórioReferência da entrada de banco de dados
table_namestringobrigatórioNome da tabela para armazenamento
id_column_namestringkeyColuna para chaves
payload_column_namestringvalueColuna para valores
expire_column_namestringexpires_atColuna para expiração
cleanup_intervalduration0Intervalo de limpeza de entradas expiradas

Nomes de colunas são validados contra injeção SQL. Crie a tabela 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;

Armazenamentos KV em Cluster {id=cluster-kv-stores}

Seção intitulada “Armazenamentos KV em Cluster {id=cluster-kv-stores}”

store.kv.raft e store.kv.crdt replicam dados chave-valor entre os nós do cluster. Ambos exigem que o clustering esteja habilitado e reutilizam a mesma API Lua do Módulo Store. Cada entrada é uma visão com namespace de um único engine ao nível do nó; namespace isola as chaves desta entrada e deve corresponder a ^[a-z][a-z0-9._-]*$ (não pode começar com _).

- name: deployments
kind: store.kv.raft
namespace: deploy
CampoTipoObrigatórioDescrição
namespacestringSimNamespace de chaves no engine compartilhado

Escritas são propostas através do Raft compartilhado (followers encaminham para o leader); leituras são linearizáveis. Escritas condicionais (put com only_if_absent/if_version) são suportadas. O estado do Raft é durável em disco por padrão, sob cluster.raft.data_dir (padrão ~/.wippy/store); veja Configuração.

- name: sessions
kind: store.kv.crdt
namespace: sess
durable: false
CampoTipoObrigatórioPadrãoDescrição
namespacestringSim-Namespace de chaves
durableboolNãofalsePersiste snapshots em disco para que o namespace sobreviva a um reinício de todo o cluster

Escritas mutam o estado local e se disseminam via gossip; escritas concorrentes conflitantes convergem por last-writer-wins. Leituras são locais. Escritas condicionais não são suportadas. Com durable: false o armazenamento é em memória e reconstrói a partir dos peers; com durable: true ele faz snapshot em <data_dir>/_sys/kvcrdt.

data_dir é ao nível do nó (cluster.raft.data_dir), não por entrada. O estado do Raft compartilhado e os snapshots duráveis do CRDT ficam sob <data_dir>/_sys/.

Ambos os armazenamentos suportam time-to-live. Entradas expiradas persistem brevemente até a limpeza executar em cleanup_interval. Defina como 0 para desabilitar limpeza automática.

Veja Módulo Store para operações: get, set, has, delete, além de put, entry, list e info para acesso versionado e condicional.