跳转到内容

Store(键值存储)

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

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

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

写入通过共享 Raft 提议(follower 转发给 leader);读取是线性化的。支持条件写入(带 only_if_absent/if_versionput)。Raft 状态默认在 cluster.raft.data_dir(默认 ~/.wippy/store)下文件系统持久化;参见配置

- name: sessions
kind: store.kv.crdt
namespace: sess
durable: false
字段类型必填默认值描述
namespacestring-键命名空间
durableboolfalse持久化文件系统快照,使命名空间在整个集群重启后仍然存留

写入会修改本地状态并通过 gossip 传播;冲突的并发写入按最后写入者胜出(last-writer-wins)收敛。读取是本地的。不支持条件写入。当 durable: false 时,存储在内存中,并从对等节点重建;当 durable: true 时,它会快照到 <data_dir>/_sys/kvcrdt

data_dir 是节点级(cluster.raft.data_dir),而非每个 entry 独立。共享 Raft 状态和持久化的 CRDT 快照位于 <data_dir>/_sys/ 下。

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

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