SNKV- 基于 sqlite B 树引擎的键值存储

发布: (2026年3月5日 GMT+8 18:52)
3 分钟阅读
原文: Dev.to

Source: Dev.to

概览

有许多键值存储可供选择,例如 RocksDB 和 LevelDB。
虽然 SQLite 是一个 SQL 数据库,但人们经常把它当作存储引擎使用。这促成了 SNKV 的诞生:

  • 代码仓库:

架构

SNKV 的架构非常简单:

kvstore 层 → b‑tree 层 → pager → OS

底层已经经过实战检验,具备生产就绪的可靠性。

在 C/C++ 项目中使用 SNKV

  1. 生成单文件头:

    make snkv.h

    或从 0.4.0 发行版下载 ZIP。

  2. .c.cpp 文件中包含该头文件,并在首次包含前定义实现宏:

    #define SNKV_IMPLEMENTATION
    #include "snkv.h"

    这会确保实现代码被编译进可执行文件。

  3. 查看 API 规范获取详细信息:

Python 支持

Python 开发者可以通过 pip 安装 SNKV:

pip install snkv

Python API 文档:

数据布局

整个 SQL 层被绕过。数据以如下格式存储:

key_len | key | value

该布局能够在 O(log n) 时间内基于键前缀快速获取值。
每个表维护一个缓存的读取游标,提升 getexists 等操作的性能。

事务模型

  • 读取事务kvstore_open 后自动启动,减少查找 mxFrame 所需的时间。
  • 写入操作 按以下顺序进行:
    1. 提交当前读取事务。
    2. 运行写入事务并提交。
    3. 再次启动新的读取事务。

示例

  • Python 示例:
  • 通用示例(C/C++):

崩溃安全性测试

实现了一个崩溃测试,步骤如下:

  1. 向一个 10 GB 的 WAL 模式数据库写入确定性的键值对。
  2. 在写入过程中使用 SIGKILL 强制终止写入进程。
  3. 重启后验证:
    • 每个已提交的事务都完整存在且字节完全一致。
    • 没有出现部分事务。
    • 数据库未出现任何损坏。

生态系统支持

由于 SNKV 使用与 SQLite 相同的存储引擎,依赖 SQLite 底层的工具可以直接与 SNKV 配合使用。已验证可用的工具包括:

  • LiteFs
  • 基于 WAL 的备份工具
  • 回滚日志工具

贡献

如果您遇到问题或有改进建议,请提交 Issue:

欢迎提供反馈和想法。

0 浏览
Back to Blog

相关文章

阅读更多 »

C# 与 F# 的关键区别是什么?

介绍 通常,我们的 .NET 客户会问这个问题:我们应该使用 C 还是 F?这两种语言都运行在相同的 .NET runtime 上,并共享对相同 libraries 的访问……

无权重新授权此项目

嗨,我是 Mark Pilgrim。你可能记得我,曾写过《Dive Into Python》和《Universal Character Encoding Detector》这些经典作品。我是 chardet 的原作者……

重新授权与 AI 辅助改写

免责声明:我不是律师,也不是版权法或软件许可方面的专家。以下帖子是对近期社区事件和法律……的分析。