Key-Value хранилище
Key-Value хранилище
Заголовок раздела «Key-Value хранилище»Быстрое key-value хранилище с поддержкой TTL. Идеально для кэширования, сессий и временного состояния.
Настройку хранилища см. в Store.
Загрузка
Заголовок раздела «Загрузка»local store = require("store")Получение хранилища
Заголовок раздела «Получение хранилища»Получить ресурс хранилища по ID реестра:
local cache, err = store.get("app:cache")if err then return nil, errend
cache:set("user:123", {name = "Alice"}, 3600)local user = cache:get("user:123")
cache:release()| Параметр | Тип | Описание |
|---|---|---|
id | string | ID ресурса хранилища |
Возвращает: Store, error
Сохранение значений
Заголовок раздела «Сохранение значений»Сохранить значение с опциональным TTL:
local cache = store.get("app:cache")
-- Простое сохранениеcache:set("user:123:name", "Alice")
-- Сохранение с TTL (истекает через 300 секунд)cache:set("session:abc", {user_id = 123, role = "admin"}, 300)| Параметр | Тип | Описание |
|---|---|---|
key | string | Ключ |
value | any | Значение (таблицы, строки, числа, булевы) |
ttl | number | TTL в секундах (опционально, 0 = без истечения) |
Возвращает: boolean, error
Получение значений
Заголовок раздела «Получение значений»Получить значение по ключу:
local user = cache:get("user:123")if not user then -- Ключ не найден или истёкend| Параметр | Тип | Описание |
|---|---|---|
key | string | Ключ для получения |
Возвращает: any, error
Возвращает nil если ключ не существует.
Проверка существования
Заголовок раздела «Проверка существования»Проверить наличие ключа без получения значения:
if cache:has("lock:" .. resource_id) then return nil, errors.new("CONFLICT", "Resource is locked")end| Параметр | Тип | Описание |
|---|---|---|
key | string | Ключ для проверки |
Возвращает: boolean, error
Удаление ключей
Заголовок раздела «Удаление ключей»Удалить ключ из хранилища:
cache:delete("session:" .. session_id)| Параметр | Тип | Описание |
|---|---|---|
key | string | Ключ для удаления |
Возвращает: boolean, error
Возвращает true если удалён, false если ключ не существовал.
Чтение метаданных записи
Заголовок раздела «Чтение метаданных записи»entry возвращает значение вместе с его version — непрозрачной строкой, используемой для оптимистичной конкурентности:
local e, err = cache:entry("user:123")if e then print(e.key, e.value, e.version)end| Параметр | Тип | Описание |
|---|---|---|
key | string | Ключ для чтения |
Возвращает: Entry, error — {key: string, value: any, version: string}
Перечисление ключей
Заголовок раздела «Перечисление ключей»Перечислить записи в детерминированном порядке ключей с постраничной разбивкой:
local page, err = cache:list({ prefix = "session:", limit = 100 })for _, e in ipairs(page.items) do print(e.key, e.value)end
-- следующая страницаif page.has_more then page = cache:list({ prefix = "session:", after = page.cursor })end| Опция | Тип | Описание |
|---|---|---|
prefix | string | Только ключи с этим префиксом |
after | string | Продолжить после этого курсора (с предыдущей страницы) |
limit | integer | Максимум элементов на странице |
Возвращает: Page, error — {items: Entry[], cursor: string, has_more: boolean}
Условные записи
Заголовок раздела «Условные записи»put записывает значение и возвращает его новый Entry. Опции включают оптимистичную конкурентность:
-- создать только если ключ не существуетlocal e, err = cache:put("lock:job-1", owner, { only_if_absent = true })if err and err:kind() == "ALREADY_EXISTS" then -- ключ держит кто-то другойend
-- compare-and-set: записать только если версия всё ещё совпадаетlocal cur = cache:entry("config")local e2, err2 = cache:put("config", new_value, { if_version = cur.version })if err2 and err2:kind() == "CONFLICT" then -- конкурентный писатель изменил его; перечитать и повторитьend| Опция | Тип | Описание |
|---|---|---|
ttl | number | TTL в секундах |
only_if_absent | boolean | Записать только если ключ не существует |
if_version | string | Записать только если текущая версия совпадает |
only_if_absent и if_version взаимоисключающи.
Возвращает: Entry, error
info().conditional_put равно true (хранилища в памяти и store.kv.raft). На store.kv.crdt и store.sql они возвращают ошибку errors.INVALID — используйте store.kv.raft, когда нужны условные записи.
Возможности хранилища
Заголовок раздела «Возможности хранилища»info сообщает о бэкенде и о том, что он поддерживает, чтобы код мог адаптироваться к привязанному хранилищу:
local info = cache:info()-- info.backend -> одно из store.backend.* (напр. "kv.raft")-- info.consistency -> одно из store.consistency.* (напр. "linearizable")-- info.durable / info.list / info.versioned / info.conditional_put / info.ttl (булевы)Возвращает: Info, error — {id, backend, consistency, durable, list, versioned, conditional_put, ttl}
Константы
Заголовок раздела «Константы»| Константа | Значения |
|---|---|
store.backend | MEMORY, SQL, KV_RAFT, KV_CRDT, UNKNOWN |
store.consistency | LINEARIZABLE, EVENTUAL, LOCAL, UNKNOWN |
if cache:info().consistency == store.consistency.LINEARIZABLE then -- безопасно использовать compare-and-setendМетоды Store
Заголовок раздела «Методы Store»| Метод | Возвращает | Описание |
|---|---|---|
get(key) | any, error | Получить значение по ключу |
entry(key) | Entry, error | Получить значение с метаданными версии |
set(key, value, ttl?) | boolean, error | Сохранить значение с опциональным TTL |
put(key, value, opts?) | Entry, error | Условная/версионированная запись, возвращает новую запись |
list(opts?) | Page, error | Постраничное перечисление в порядке ключей |
has(key) | boolean, error | Проверить существование ключа |
delete(key) | boolean, error | Удалить ключ |
info() | Info, error | Бэкенд, согласованность и флаги возможностей |
release() | boolean | Вернуть хранилище в пул |
Разрешения
Заголовок раздела «Разрешения»Операции хранилища подчиняются вычислению политики безопасности.
| Действие | Ресурс | Атрибуты | Описание |
|---|---|---|---|
store.get | ID хранилища | - | Получить ресурс хранилища |
store.key.get | ID хранилища | key | Прочитать значение ключа |
store.key.set | ID хранилища | key | Записать значение ключа |
store.key.delete | ID хранилища | key | Удалить ключ |
store.key.has | ID хранилища | key | Проверить существование ключа |
store.get() и все методы дескриптора хранилища (get, set, has, delete) возвращают структурированные ошибки (используйте err:kind()).
| Условие | Kind | Повторяемо |
|---|---|---|
| Пустой ID ресурса | errors.INVALID | нет |
| Ресурс не найден | errors.NOT_FOUND | нет |
| Хранилище освобождено | errors.INVALID | нет |
| Доступ запрещён | errors.PERMISSION_DENIED | нет |
only_if_absent и ключ существует | errors.ALREADY_EXISTS | нет |
Несовпадение if_version | errors.CONFLICT | да |
| Условная запись на хранилище без поддержки | errors.INVALID | нет |
См. Обработка ошибок для работы с ошибками.