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

Хранилища ключ-значение с поддержкой 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_size int 10000 Максимум записей (0 = без ограничений)
cleanup_interval duration 5m Интервал очистки просроченных записей

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

SQL-хранилище

- name: cache
  kind: store.sql
  database: app:postgres
  table_name: kv_store
  cleanup_interval: "10m"
  lifecycle:
    auto_start: true
Поле Тип По умолчанию Описание
database reference обязательно Ссылка на запись базы данных
table_name string обязательно Имя таблицы
id_column_name string key Колонка для ключей
payload_column_name string value Колонка для значений
expire_column_name string expires_at Колонка для срока действия
cleanup_interval duration 0 Интервал очистки просроченных записей

Имена колонок проверяются на 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;

Кластерные KV-хранилища {id=cluster-kv-stores}

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

Raft (строгая согласованность)

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

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

CRDT (согласованность в конечном счёте)

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

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

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

Поведение TTL

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

Lua API

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

См. также