kv-storage
一个基于 sled 的 Rust 异步持久化 KV 存储库,整体使用方式接近 Redis 的常见数据结构,当前支持:
- Key-Value
- Map / Hash
- List / Queue
- Counter
- TTL 过期
- 批量操作
- 异步迭代扫描
项目已经提供 tokio 异步接口,并通过测试覆盖了 KV、Map、List、Counter、TTL、批量写入、遍历和模式扫描等典型场景。
特性概览
- 基于
sled的嵌入式本地存储,无需独立部署数据库服务 - 面向
tokio的异步 API,适合服务端项目集成 - 支持序列化任意实现
Serialize/DeserializeOwned的数据 - 提供独立的
Map与List命名空间,便于组织结构化数据 - 支持计数器自增、自减、设置与读取
- 支持键、Map、List 的 TTL 与后台过期清理
- 支持批量插入、批量删除、前缀遍历、通配扫描
- 可通过 Cargo feature 控制
ttl、len、map_len
安装
Cargo.toml
[]
= "0.1.0"
如需按需关闭默认特性:
[]
= { = "0.1.0", = false, = ["ttl", "len", "map_len"] }
默认启用的特性:
ttl:支持过期时间与后台清理len:支持数据库级len()map_len:支持Map::len()
快速开始
use ;
async
配置说明
Config 当前包含以下主要字段:
use Config;
let cfg = Config ;
path:sled 数据目录,必填,不能为空cache_capacity:缓存大小,默认1GBcleanup_f:过期数据清理函数,默认会启动后台清理任务
注意:
path为空时,init_db会返回错误- 默认配置会设置
flush_every_ms(Some(3000)) - 存储模式当前使用
sled::Mode::LowSpace
核心用法
1. Key-Value
db.insert.await?;
let value: = db.get.await?;
let exists = db.contains_key.await?;
db.remove.await?;
支持批量操作:
db.batch_insert.await?;
db.batch_remove.await?;
2. Map / Hash
use Map;
let map = db.map.await?;
map.insert.await?;
map.insert.await?;
let value: = map.get.await?;
let exists = map.contains_key.await?;
let empty = map.is_empty.await?;
map.remove.await?;
map.clear.await?;
创建时可附带过期时间(毫秒):
let session_map = db.map.await?;
3. List / Queue
use List;
let list = db.list.await?;
list.push.await?;
list.push.await?;
let first: = list.pop.await?;
let all: = list.all.await?;
let by_index: = list.get_index.await?;
let len = list.len.await?;
限制列表长度:
let removed: = list.push_limit.await?;
含义:
limit = 10:列表最多保留 10 项pop_front_if_limited = true:超限时弹出最早的数据- 返回值为被移除的元素
4. Counter
db.counter_incr.await?;
db.counter_decr.await?;
db.counter_set.await?;
let value = db.counter_get.await?;
5. TTL
如果启用了 ttl 特性,可以对 KV、Map、List 设置过期时间。
db.insert.await?;
db.expire.await?;
let ttl = db.ttl.await?;
Map / List 同样支持:
let map = db.map.await?;
map.expire.await?;
let list = db.list.await?;
let now_ms = now
.duration_since?
.as_millis as i64;
list.expire_at.await?;
说明:
expire(key, dur)中的dur单位为毫秒expire_at(key, at)使用毫秒时间戳- 过期后读取通常返回
None、空集合或长度0 - 默认后台任务会周期性清理真正落盘的过期数据
遍历与扫描
遍历 Map
use Map;
let mut map = db.map.await?;
let mut iter = map..await?;
while let Some = iter.next.await
遍历 List
use List;
let mut list = db.list.await?;
let mut iter = list..await?;
while let Some = iter.next.await
遍历所有 Map / List
let mut db = db.clone;
let mut map_iter = db.map_iter.await?;
while let Some = map_iter.next.await
let mut list_iter = db.list_iter.await?;
while let Some = list_iter.next.await
模式扫描
let mut db = db.clone;
let mut iter = db.scan.await?;
while let Some = iter.next.await
支持的模式字符:
*:匹配任意长度字符?:匹配单个字符\*/\?:转义后的字面量
API 概览
StorageDB
insert/get/removebatch_insert/batch_removecontains_keycounter_incr/counter_decr/counter_get/counter_setmap/map_remove/map_iterlist/list_remove/list_iterscandb_sizeinfoexpire/expire_at/ttl(需ttl特性)len(需len特性)
Map
insert/get/removecontains_keyclear/is_emptyremove_and_fetchremove_with_prefixbatch_insert/batch_removeiter/key_iter/prefix_iterexpire/expire_at/ttl(需ttl特性)len(需map_len特性)
List
push/pushs/push_limitpopall/get_indexlen/is_empty/cleariterexpire/expire_at/ttl(需ttl特性)
适用场景
- 轻量级本地持久化缓存
- 单机服务内嵌存储
- 任务队列、事件列表、最近记录列表
- 会话数据、配置项、临时状态存储
- 需要 TTL 和计数器能力,但不想引入独立 Redis 服务的场景
当前实现说明
- 当前公开入口为
sled后端 - 对外接口是异步的,但底层依赖
sled的本地嵌入式能力 - 数据编码主要通过
bincode完成 - 默认测试中已经验证大批量写入、TTL 清理、前缀遍历、通配扫描等能力
开发与测试
运行测试:
格式检查与静态检查可按需执行:
License
MIT