bitcask

    A Bitcask key-value storage engine implemented in MoonBit

    storage
    bitcask
    kv
    database
    engine
    Download zip
    Author
    Version
    0.1.3
    License
    Apache-2.0
    Last updated
    2 hours ago
    Downloads
    4

    No dependencies

    简体中文 | English

    #MoonBit Bitcask

    使用 MoonBit 实现的 Bitcask 键值存储引擎——与 Riak 默认存储后端相同的设计。

    #特性

    • 追加写:每次 put 只做一次顺序写 + 一次内存哈希索引更新,写路径上没有任何随机 IO。
    • 读放大为 1:内存索引(keydir)直接指向记录所在的 (文件, 偏移),一次 seek 即可读出。
    • 墓碑删除:删除写一条墓碑记录,磁盘上不做任何原地修改。
    • 文件轮转:数据文件以递增 ID 命名(0.data、1.data、…),活跃文件达到 max_file_size 后自动轮转。
    • 崩溃安全恢复:打开时按文件 ID 升序重放(后写覆盖先写);损坏的尾部(CRC 不符/截断)只影响当前文件,之前已落盘的数据完好。
    • Merge(压缩):重写每个 key 的最新版本到新文件以回收空间;新文件先落盘,再删除旧文件。
    • Hint 文件:merge 后生成 {id}.hint 存储键→位置元信息,恢复时间与 key 数量成正比,而与总数据量无关。

    #用法

    let db = @bitcask.open("my-data") // 默认 max_file_size = 256 MiB,写入不强制 fsync
    db.put(b"hello", b"world")
    let value = db.get(b"hello") // Some(b"world")
    db.delete(b"hello")
    db.merge() // 回收空间
    db.close()

    带参数打开:

    // 64 MiB 轮转,每次写入 fdatasync(写入即持久)
    let db = @bitcask.open("my-data", max_file_size=67108864L, sync=@fs.SyncMode.Data)

    运行交互式命令行:

    moon run cmd/main

    #磁盘格式

    每条记录(小端序):

    +-------+------+---------+-----------+-----------+-----+-------+ | crc32 | ts | key_len | value_len | tombstone | key | value | | 4B | 8B | 4B | 4B | 1B | 变长 | 变长 | +-------+------+---------+-----------+-----------+-----+-------+

    Hint 记录:key_len(4B) | value_len(4B) | offset(8B) | ts(8B) | key。

    #固有限制(Bitcask 本身的设计边界)

    • 所有 key 必须装进内存。
    • 不支持范围查询:索引是无序哈希表。
    • 空间只能通过 merge() 回收。

    #开发

    moon check --target native # 类型检查 moon test --target native # 运行测试