VDB 1.0.1.0 发布:面向现代 C++ 的 header-only 嵌入式键值数据库

简介

VDB 是一个面向进程内嵌入式场景的高性能键值数据库:

  • 数据与应用程序运行在同一进程中;
  • 采用内存映射与页式 B+ 树;
  • 支持多读者、单写 MVCC 并发模型;
  • 写路径通过写时复制保证旧快照不受影响;
  • 提供事务提交、回滚、嵌套事务、子库和游标;
  • 支持溢出页、脏页 spill、空闲页回收和崩溃恢复;
  • 可选分页加密与完整性校验。

存储引擎派生自 LMDB,公共接口则是全新的现代 C++ 设计。

设计亮点

1. 真正的现代 C++ 接口

公共 API 使用 C++23 起提供的语言设施:

  • Env、Txn、Cursor 为 move-only RAII 句柄;
  • Dbi 是可拷贝的轻量句柄;
  • 读取结果使用 std::span 视图表达;
  • 可能失败的操作返回 std::expected 或 std::error_code;
  • 接口全部 noexcept,不通过异常跨越 API 边界;
  • 支持无状态回调的编译期桥接。

示例:

#include <vdb/vdb.hpp>

int main()
{
    auto env_result = vdb::Env::create();
    if (!env_result)
        return 1;

    auto env = std::move(*env_result);
    if (env.set_mapsize(4u << 20u))
        return 1;

    if (env.open("data",
                 vdb::env_flags::create | vdb::env_flags::writemap))
        return 1;

    auto txn_result = env.begin();
    if (!txn_result)
        return 1;

    auto txn = std::move(*txn_result);
    auto dbi_result = txn.open_dbi();
    if (!dbi_result)
        return 1;

    const auto dbi = *dbi_result;
    if (txn.put(dbi, vdb::as_bytes("hello"), vdb::as_bytes("vdb")))
        return 1;

    return txn.commit() ? 1 : 0;
}

2. Header-only,集成简单

VDB 没有需要编译和链接的库产物。最简单的集成方式是:

cp -r vdb/ /path/to/your/include/
c++ -std=c++23 -I/path/to/your/include app.cpp -lpthread

使用 CMake 的项目也可以直接安装导出的接口目标:

find_package(vdb CONFIG REQUIRED)
target_link_libraries(app PRIVATE vdb::vdb)

3. 保留成熟引擎能力

VDB 的底层存储引擎沿用 LMDB 风格设计:

  • 页式 B+ 树与固定页格式;
  • 双元页交替写入与崩溃恢复;
  • MVCC 快照和读者槽管理;
  • 单写事务、嵌套和事务回滚;
  • 溢出页用于存储大值;
  • 脏页预算控制与 spill;
  • 空闲页延迟回收;
  • 可选分页加密与校验和。

4. 工程质量内置在开发流程中

发布版本包含两道确定性回归:

  • golden 字节回归:生成的数据文件与基准样本逐字节一致;
  • baseline 行为回归:覆盖 writemap、prealloc、remap、enc、spill 五种模式。

此外还包括:

  • ABI contract 与 ABI manifest;
  • 头文件自足性检查;
  • 多翻译单元 ODR 检查;
  • 故障路径测试;
  • C++23 与 C++26 双标准构建验证。

版本号说明

当前版本为 1.0.1.0。

版本号采用四段式:

  • 前三段 1.0.1 对齐上游 LMDB 基线;
  • 第四段 0 表示 VDB 自身在该基线上的修改版本。

兼容性承诺

当前版本冻结以下契约:

  • 数据库 page 格式;
  • lock 文件布局;
  • 事务提交与回滚语义;
  • 公共句柄所有权模型;
  • 公共值类型布局;
  • 错误码数值;
  • CMake 包名 vdb::vdb。

常规缺陷修复不会改变上述内容。

已知限制

初始版本仍有明确边界:

  • 仅支持 64 位平台;
  • 默认页面大小为 64KB(可配置);
  • 当前面向 POSIX,已在 Cygwin 与 WSL2 环境验证;
  • 最低要求 C++23,默认构建使用 C++26;
  • 每个包含 vdb.hpp 的翻译单元都会编译完整 header-only 实现;
  • 库面向嵌入式单机场景,不提供网络服务和分布式能力。

许可

VDB 的许可分两部分:

  • 派生自 LMDB 的存储引擎部分遵循 OLDAP-2.8;
  • 项目自身的现代 C++ 接口、重构、文档与测试遵循 BSD 3-Clause。

再分发时请同时保留 LICENSE 与 COPYRIGHT_LMDB。

相关链接

开始使用

git clone https://github.com/vecdim/vdb.git
cd vdb

cmake -S . -B build -DVDB_CXX_STANDARD=26
cmake --build buildj
ctest --test-dir build --output-on-failure

如果你正在寻找一个可以直接嵌入 C++ 服务、接口现代、部署简单,同时又继承 LMDB 存储引擎语义的键值数据库,欢迎试用 VDB。

发表评论