#lsm-tree #persistence #embedded-database #bindings #embedded

rust-rocksdb

Facebook的RocksDB嵌入式数据库的Rust封装

18个版本 (7个重大更改)

新版本 0.29.0 2024年8月21日
0.28.1 2024年7月27日
0.27.1 2024年7月7日
0.23.2 2024年3月30日

#237数据库接口

Download history 267/week @ 2024-05-01 153/week @ 2024-05-08 80/week @ 2024-05-15 352/week @ 2024-05-22 251/week @ 2024-05-29 292/week @ 2024-06-05 609/week @ 2024-06-12 266/week @ 2024-06-19 390/week @ 2024-06-26 503/week @ 2024-07-03 328/week @ 2024-07-10 244/week @ 2024-07-17 459/week @ 2024-07-24 305/week @ 2024-07-31 101/week @ 2024-08-07 33/week @ 2024-08-14

每月951 次下载

Apache-2.0

23MB
470K SLoC

C++ 400K SLoC // 0.1% comments Java 43K SLoC // 0.3% comments Rust 10K SLoC // 0.1% comments Python 8K SLoC // 0.1% comments Shell 4K SLoC // 0.2% comments C 3.5K SLoC // 0.0% comments GNU Style Assembly 542 SLoC // 0.1% comments INI 323 SLoC // 0.1% comments PowerShell 312 SLoC // 0.2% comments Bitbake 167 SLoC // 0.2% comments Bazel 100 SLoC // 0.5% comments

rust-rocksdb

RocksDB build crates.io documentation license rust 1.75.0 required

GitHub commits (since latest release)

为什么分支

原始的rust-rocksdb仓库非常出色,我非常感激所有的工作,然而,对于我的使用场景,我需要保持与最新的rocksdb版本以及最新的rust版本同步,因此为了保持一切更新,我决定从原始仓库分叉,以便我能够完全控制并能够创建定期发布。

要求

  • Clang和LLVM

Rust版本

rust-rocksdb保持6个月的滚动MSRV(最低支持Rust版本)政策。这意味着只要新使用的Rust版本至少有6个月的历史,我们就会接受升级MSRV的PR。

我们当前的MSRV是1.75。

贡献

欢迎反馈和pull请求!如果您对RocksDB的某个特定功能很重要,请通过打开一个issue告诉我,我会优先考虑。

用法

此绑定与特定版本的RocksDB静态链接。如果您想自己构建它,请确保您已经克隆了RocksDB和压缩子模块

git submodule update --init --recursive

特性

压缩支持

默认情况下,通过crate功能启用对SnappyLZ4ZstdZlibBzip2压缩的支持。如果不需要所有这些压缩算法的支持,可以禁用默认功能并启用特定的压缩算法。例如,要仅启用LZ4压缩支持,请对您的Cargo.toml进行以下更改

[dependencies.rocksdb]
default-features = false
features = ["lz4"]

多线程ColumnFamily交替

RocksDB 允许在多个线程中同时创建和删除列族,但为了兼容性,这个包默认不允许这样做。如果您需要并发修改列族,请启用包特性 multi-threaded-cf,这将使得这个绑定的数据结构默认使用 RwLock。或者,您可以直接创建 DBWithThreadMode<MultiThreaded> 而不需要启用包特性。

在/MT或/MD运行时库之间切换(仅限Windows)

特性 mt_static 将请求使用 /MT 标志构建库,这将导致库使用运行时库的静态版本。这可以在不同运行时版本之间存在依赖树冲突的情况下很有用。

Jemalloc

特性 jemalloc 将启用 unprefixed_malloc_on_supported_platforms 特性,钩住实际的 malloc 和 free,以便使用 jemalloc 来分配内存。在支持的平台上(如 Linux),Rocksdb 也会得到适当的提示,Jemalloc 已启用,以便它可以应用内部优化。在不支持的平台上(见此处),Rocksdb 不会得到适当的提示 Jemalloc 正在使用,因此会跳过一些内部优化,但您仍然会得到 Jemalloc 内存分配的好处。注意,默认情况下,Rust 在 Linux 上使用 libc malloc,这比 Jemalloc 有更多的内存碎片,特别是在使用 Rocksdb 的情况下。有关更多信息,请参阅 GitHub 问题。总的来说,除非有特殊原因不启用(您的系统不支持等),我强烈建议启用 Jemalloc。

可用的 Malloc 大小

特性 malloc-usable-size 将通知 Rocksdb 平台支持 malloc_usable_size,并且如果您想使用 optimize_filters_for_memory rocksdb 特性,这是必要的,因为该特性受限于 malloc_usable_size 是否可用。有关该特性的更多信息,请参阅 rocksdb

仅静态链接 ZSTD

与启用 ZSTD 压缩结合的特性 zstd-static-linking-only 将导致 Rocksdb 将处理过的字典保留在块缓存中,以节省重复反序列化的开销。这为读取密集型工作负载节省了大量 CPU。由于其中一个处理过的字典 API 被标记为实验性,因此此功能受 Rocksdb 中的一个标志的限制。然而,根据 预设字典压缩博客文章,该功能仍然在 Facebook 的生产环境中使用。

依赖关系

~0.3–4.5MB
~79K SLoC