Ir al contenido

Almacen Clave-Valor

Almacenamiento clave-valor rapido con soporte de TTL. Ideal para cache, sesiones y estado temporal.

Para configuración del almacen, consulte Almacen.

local store = require("store")

Obtener un recurso de almacen por ID de 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ámetroTipoDescripción
idstringID de recurso del almacen

Devuelve: Store, error

Almacenar un valor con TTL opcional:

local cache = store.get("app:cache")
-- Set simple
cache:set("user:123:name", "Alice")
-- Set con TTL (expira en 300 segundos)
cache:set("session:abc", {user_id = 123, role = "admin"}, 300)
ParámetroTipoDescripción
keystringClave
valueanyValor (tablas, strings, numeros, booleanos)
ttlnumberTTL en segundos (opcional, 0 = sin expiracion)

Devuelve: boolean, error

Obtener un valor por clave:

local user = cache:get("user:123")
if not user then
-- Clave no encontrada o expirada
end
ParámetroTipoDescripción
keystringClave a recuperar

Devuelve: any, error

Devuelve nil si la clave no existe.

Verificar si una clave existe sin recuperar:

if cache:has("lock:" .. resource_id) then
return nil, errors.new("CONFLICT", "Resource is locked")
end
ParámetroTipoDescripción
keystringClave a verificar

Devuelve: boolean, error

Eliminar una clave del almacen:

cache:delete("session:" .. session_id)
ParámetroTipoDescripción
keystringClave a eliminar

Devuelve: boolean, error

Devuelve true si se elimino, false si la clave no existia.

entry devuelve el valor junto con su version — una cadena opaca usada para concurrencia optimista:

local e, err = cache:entry("user:123")
if e then
print(e.key, e.value, e.version)
end
ParámetroTipoDescripción
keystringClave a leer

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

Lista entradas en orden determinista de claves, con paginación:

local page, err = cache:list({ prefix = "session:", limit = 100 })
for _, e in ipairs(page.items) do
print(e.key, e.value)
end
-- siguiente página
if page.has_more then
page = cache:list({ prefix = "session:", after = page.cursor })
end
OpciónTipoDescripción
prefixstringSolo claves con este prefijo
afterstringContinuar después de este cursor (de una página anterior)
limitintegerMáximo de elementos por página

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

put escribe un valor y devuelve su nueva Entry. Las opciones habilitan concurrencia optimista:

-- crear solo si la clave no existe
local e, err = cache:put("lock:job-1", owner, { only_if_absent = true })
if err and err:kind() == "ALREADY_EXISTS" then
-- otro la tiene
end
-- compare-and-set: escribir solo si la versión aún coincide
local cur = cache:entry("config")
local e2, err2 = cache:put("config", new_value, { if_version = cur.version })
if err2 and err2:kind() == "CONFLICT" then
-- un escritor concurrente la cambió; volver a leer y reintentar
end
OpciónTipoDescripción
ttlnumberTTL en segundos
only_if_absentbooleanEscribir solo si la clave no existe
if_versionstringEscribir solo si la versión actual coincide

only_if_absent e if_version son mutuamente exclusivos.

Devuelve: Entry, error

Las escrituras condicionales requieren un almacén cuyo info().conditional_put sea true (los almacenes memory y store.kv.raft). En store.kv.crdt y store.sql devuelven un error errors.INVALID — usa store.kv.raft cuando necesites escrituras condicionales.

info reporta el backend y lo que soporta, de modo que el código puede adaptarse al almacén que esté vinculado:

local info = cache:info()
-- info.backend -> uno de store.backend.* (p. ej. "kv.raft")
-- info.consistency -> uno de store.consistency.* (p. ej. "linearizable")
-- info.durable / info.list / info.versioned / info.conditional_put / info.ttl (booleanos)

Devuelve: 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étodoDevuelveDescripción
get(key)any, errorRecuperar valor por clave
entry(key)Entry, errorRecuperar valor con metadatos de versión
set(key, value, ttl?)boolean, errorAlmacenar valor con TTL opcional
put(key, value, opts?)Entry, errorEscritura condicional/versionada, devuelve la nueva entrada
list(opts?)Page, errorListado paginado en orden de claves
has(key)boolean, errorVerificar si clave existe
delete(key)boolean, errorEliminar clave
info()Info, errorBackend, consistencia y banderas de capacidad
release()booleanLiberar almacen de vuelta al pool

Las operaciones de almacen estan sujetas a evaluacion de politica de seguridad.

AccionRecursoAtributosDescripción
store.getID de Store-Adquirir un recurso de almacen
store.key.getID de StorekeyLeer valor de una clave
store.key.setID de StorekeyEscribir valor de una clave
store.key.deleteID de StorekeyEliminar una clave
store.key.hasID de StorekeyVerificar existencia de clave

store.get() y todos los métodos del manejador de store (get, set, has, delete) devuelven errores estructurados (usa err:kind()).

CondiciónTipoReintentable
ID de recurso vacioerrors.INVALIDno
Recurso no encontradoerrors.NOT_FOUNDno
Almacen liberadoerrors.INVALIDno
Permiso denegadoerrors.PERMISSION_DENIEDno
only_if_absent y la clave existeerrors.ALREADY_EXISTSno
Discrepancia de if_versionerrors.CONFLICT
Escritura condicional en un almacén sin soporteerrors.INVALIDno

Consulte Manejo de Errores para trabajar con errores.