Pular para o conteúdo

Key-Value Store

Armazenamento key-value rapido com suporte a TTL. Ideal para cache, sessoes e estado temporario.

Para configuração de store, veja Store.

local store = require("store")

Obter um recurso store por ID do registro:

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()
ParâmetroTipoDescrição
idstringID do recurso store

Retorna: Store, error

Armazenar um valor com TTL opcional:

local cache = store.get("app:cache")
-- Set simples
cache:set("user:123:name", "Alice")
-- Set com TTL (expira em 300 segundos)
cache:set("session:abc", {user_id = 123, role = "admin"}, 300)
ParâmetroTipoDescrição
keystringChave
valueanyValor (tabelas, strings, numeros, booleans)
ttlnumberTTL em segundos (opcional, 0 = sem expiração)

Retorna: boolean, error

Obter um valor por chave:

local user = cache:get("user:123")
if not user then
-- Chave não encontrada ou expirada
end
ParâmetroTipoDescrição
keystringChave para recuperar

Retorna: any, error

Retorna nil se chave não existe.

Verificar se uma chave existe sem recuperar:

if cache:has("lock:" .. resource_id) then
return nil, errors.new("CONFLICT", "Resource is locked")
end
ParâmetroTipoDescrição
keystringChave para verificar

Retorna: boolean, error

Remover uma chave do store:

cache:delete("session:" .. session_id)
ParâmetroTipoDescrição
keystringChave para deletar

Retorna: boolean, error

Retorna true se deletado, false se chave não existia.

entry retorna o valor junto com sua version — uma string opaca usada para concorrência otimista:

local e, err = cache:entry("user:123")
if e then
print(e.key, e.value, e.version)
end
ParâmetroTipoDescrição
keystringChave para ler

Retorna: Entry, error{key: string, value: any, version: string}

Listar entradas em ordem determinística de chave, com paginação:

local page, err = cache:list({ prefix = "session:", limit = 100 })
for _, e in ipairs(page.items) do
print(e.key, e.value)
end
-- próxima página
if page.has_more then
page = cache:list({ prefix = "session:", after = page.cursor })
end
OpçãoTipoDescrição
prefixstringApenas chaves com este prefixo
afterstringContinuar após este cursor (de uma página anterior)
limitintegerMáximo de itens por página

Retorna: Page, error{items: Entry[], cursor: string, has_more: boolean}

put escreve um valor e retorna sua nova Entry. As opções habilitam concorrência otimista:

-- cria apenas se a chave não existir
local e, err = cache:put("lock:job-1", owner, { only_if_absent = true })
if err and err:kind() == "ALREADY_EXISTS" then
-- outra pessoa a detém
end
-- compare-and-set: escreve apenas se a versão ainda corresponder
local cur = cache:entry("config")
local e2, err2 = cache:put("config", new_value, { if_version = cur.version })
if err2 and err2:kind() == "CONFLICT" then
-- um escritor concorrente a alterou; releia e tente novamente
end
OpçãoTipoDescrição
ttlnumberTTL em segundos
only_if_absentbooleanEscreve apenas se a chave não existir
if_versionstringEscreve apenas se a versão atual corresponder

only_if_absent e if_version são mutuamente exclusivos.

Retorna: Entry, error

Escritas condicionais exigem um store cujo info().conditional_put seja true (os stores de memória e store.kv.raft). Em store.kv.crdt e store.sql elas retornam um erro errors.INVALID — use store.kv.raft quando precisar de escritas condicionais.

info informa o backend e o que ele suporta, para que o código possa se adaptar a qualquer store vinculado:

local info = cache:info()
-- info.backend -> um de store.backend.* (ex.: "kv.raft")
-- info.consistency -> um de store.consistency.* (ex.: "linearizable")
-- info.durable / info.list / info.versioned / info.conditional_put / info.ttl (booleans)

Retorna: Info, error{id, backend, consistency, durable, list, versioned, conditional_put, ttl}

ConstanteValores
store.backendMEMORY, SQL, KV_RAFT, KV_CRDT, UNKNOWN
store.consistencyLINEARIZABLE, EVENTUAL, LOCAL, UNKNOWN
if cache:info().consistency == store.consistency.LINEARIZABLE then
-- seguro usar compare-and-set
end
MétodoRetornaDescrição
get(key)any, errorRecuperar valor por chave
entry(key)Entry, errorRecuperar valor com metadados de versão
set(key, value, ttl?)boolean, errorArmazenar valor com TTL opcional
put(key, value, opts?)Entry, errorEscrita condicional/versionada, retorna a nova entrada
list(opts?)Page, errorListagem paginada em ordem de chave
has(key)boolean, errorVerificar se chave existe
delete(key)boolean, errorRemover chave
info()Info, errorBackend, consistência e flags de capacidade
release()booleanLiberar store de volta ao pool

Operações de store estao sujeitas a avaliação de política de segurança.

AçãoRecursoAtributosDescrição
store.getID do Store-Adquirir um recurso store
store.key.getID do StorekeyLer valor de uma chave
store.key.setID do StorekeyEscrever valor de uma chave
store.key.deleteID do StorekeyDeletar uma chave
store.key.hasID do StorekeyVerificar existencia de chave

store.get() e todos os métodos do handle do store (get, set, has, delete) retornam erros estruturados (use err:kind()).

CondiçãoTipoRetentável
ID de recurso vazioerrors.INVALIDnão
Recurso não encontradoerrors.NOT_FOUNDnão
Store liberadoerrors.INVALIDnão
Permissão negadaerrors.PERMISSION_DENIEDnão
only_if_absent e chave existeerrors.ALREADY_EXISTSnão
Divergência de if_versionerrors.CONFLICTsim
Escrita condicional em store sem suporteerrors.INVALIDnão

Veja Error Handling para trabalhar com erros.