Store(键值存储)

支持 TTL 的键值存储:内存、SQL 支持,以及集群复制(Raft 和 CRDT)。

Entry 类型

Kind 描述
store.memory 带自动清理的内存存储
store.sql 带持久化的 SQL 支持存储
store.kv.raft 基于共享 Raft 的集群复制、强一致性 KV
store.kv.crdt 基于 gossip(CRDT)的集群复制、最终一致性 KV

内存存储

- 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 required 数据库 entry 引用
table_name string required 存储表名
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.raftstore.kv.crdt 在集群各节点间复制键值数据。两者都要求启用集群,并复用相同的 Store 模块 Lua API。每个 entry 都是对节点级单一引擎的命名空间视图;namespace 隔离此 entry 的键,且必须匹配 ^[a-z][a-z0-9._-]*$(不能以 _ 开头)。

Raft(强一致性)

- name: deployments
  kind: store.kv.raft
  namespace: deploy
字段 类型 必填 描述
namespace string 共享引擎中的键命名空间

写入通过共享 Raft 提议(follower 转发给 leader);读取是线性化的。支持条件写入(带 only_if_absent/if_versionput)。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),而非每个 entry 独立。共享 Raft 状态和持久化的 CRDT 快照位于 <data_dir>/_sys/ 下。

TTL 行为

两种存储都支持生存时间。过期条目会短暂保留,直到 cleanup_interval 执行清理。设置为 0 可禁用自动清理。

Lua API

参见 Store 模块 了解操作:getsethasdelete,以及用于版本化和条件访问的 putentrylistinfo

另请参阅