SNKV- 基于 sqlite B 树引擎的键值存储
Source: Dev.to
概览
有许多键值存储可供选择,例如 RocksDB 和 LevelDB。
虽然 SQLite 是一个 SQL 数据库,但人们经常把它当作存储引擎使用。这促成了 SNKV 的诞生:
- 代码仓库:
架构
SNKV 的架构非常简单:
kvstore 层 → b‑tree 层 → pager → OS
底层已经经过实战检验,具备生产就绪的可靠性。
在 C/C++ 项目中使用 SNKV
-
生成单文件头:
make snkv.h或从 0.4.0 发行版下载 ZIP。
-
在
.c或.cpp文件中包含该头文件,并在首次包含前定义实现宏:#define SNKV_IMPLEMENTATION #include "snkv.h"这会确保实现代码被编译进可执行文件。
-
查看 API 规范获取详细信息:
Python 支持
Python 开发者可以通过 pip 安装 SNKV:
pip install snkv
Python API 文档:
数据布局
整个 SQL 层被绕过。数据以如下格式存储:
key_len | key | value
该布局能够在 O(log n) 时间内基于键前缀快速获取值。
每个表维护一个缓存的读取游标,提升 get、exists 等操作的性能。
事务模型
- 读取事务 在
kvstore_open后自动启动,减少查找mxFrame所需的时间。 - 写入操作 按以下顺序进行:
- 提交当前读取事务。
- 运行写入事务并提交。
- 再次启动新的读取事务。
示例
- Python 示例:
- 通用示例(C/C++):
崩溃安全性测试
实现了一个崩溃测试,步骤如下:
- 向一个 10 GB 的 WAL 模式数据库写入确定性的键值对。
- 在写入过程中使用
SIGKILL强制终止写入进程。 - 重启后验证:
- 每个已提交的事务都完整存在且字节完全一致。
- 没有出现部分事务。
- 数据库未出现任何损坏。
生态系统支持
由于 SNKV 使用与 SQLite 相同的存储引擎,依赖 SQLite 底层的工具可以直接与 SNKV 配合使用。已验证可用的工具包括:
- LiteFs
- 基于 WAL 的备份工具
- 回滚日志工具
贡献
如果您遇到问题或有改进建议,请提交 Issue:
欢迎提供反馈和想法。