Перейти к содержимому

Хранилище ключ-значение

Хранилища ключ-значение с поддержкой TTL: в памяти, на базе SQL и реплицируемые в кластере (Raft и CRDT).

ТипОписание
store.memoryХранилище в памяти с автоматической очисткой
store.sqlХранилище на базе SQL с персистентностью
store.kv.raftРеплицируемое в кластере, строго согласованное KV на общем Raft
store.kv.crdtРеплицируемое в кластере, согласованное в конечном счёте KV через gossip (CRDT)
- name: sessions
kind: store.memory
max_size: 10000
cleanup_interval: "5m"
lifecycle:
auto_start: true
ПолеТипПо умолчаниюОписание
max_sizeint10000Максимум записей (0 = без ограничений)
cleanup_intervalduration5mИнтервал очистки просроченных записей

При достижении max_size новые записи отклоняются. Данные теряются при перезапуске.

- name: cache
kind: store.sql
database: app:postgres
table_name: kv_store
cleanup_interval: "10m"
lifecycle:
auto_start: true
ПолеТипПо умолчаниюОписание
databasereferenceобязательноСсылка на запись базы данных
table_namestringобязательноИмя таблицы
id_column_namestringkeyКолонка для ключей
payload_column_namestringvalueКолонка для значений
expire_column_namestringexpires_atКолонка для срока действия
cleanup_intervalduration0Интервал очистки просроченных записей

Имена колонок проверяются на SQL-инъекции. Создайте таблицу перед использованием:

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;

store.kv.raft и store.kv.crdt реплицируют данные ключ-значение по нодам кластера. Оба требуют включённой кластеризации и используют то же Lua API Модуля Store. Каждая запись — это представление с пространством имён в одном общенодовом движке; namespace изолирует ключи этой записи и должен соответствовать ^[a-z][a-z0-9._-]*$ (не может начинаться с _).

- name: deployments
kind: store.kv.raft
namespace: deploy
ПолеТипОбязательноОписание
namespacestringДаПространство имён ключей в общем движке

Записи предлагаются через общий Raft (фолловеры пересылают лидеру); чтения линеаризуемы. Поддерживаются условные записи (put с only_if_absent/if_version). Состояние Raft по умолчанию долговечно на ФС под cluster.raft.data_dir (по умолчанию ~/.wippy/store); см. Конфигурация.

- name: sessions
kind: store.kv.crdt
namespace: sess
durable: false
ПолеТипОбязательноПо умолчаниюОписание
namespacestringДа-Пространство имён ключей
durableboolНетfalseСохранять снимки на ФС, чтобы пространство имён пережило перезапуск всего кластера

Записи изменяют локальное состояние и распространяются через gossip; конфликтующие конкурентные записи сходятся по принципу last-writer-wins. Чтения локальны. Условные записи не поддерживаются. При durable: false хранилище работает в памяти и восстанавливается от пиров; при durable: true оно делает снимки в <data_dir>/_sys/kvcrdt.

data_dir задаётся на уровне ноды (cluster.raft.data_dir), а не на запись. Общее состояние Raft и долговечные снимки CRDT хранятся под <data_dir>/_sys/.

Оба хранилища поддерживают время жизни записей. Просроченные записи сохраняются до момента очистки с интервалом cleanup_interval. Установите 0 для отключения автоматической очистки.

См. Модуль Store для операций: get, set, has, delete, а также put, entry, list и info для версионированного и условного доступа.