| Crates.io | melange_db |
| lib.rs | melange_db |
| version | 0.1.5 |
| created_at | 2025-09-16 04:37:48.182533+00 |
| updated_at | 2025-09-24 01:19:43.523633+00 |
| description | 基于 sled 架构深度优化的下一代高性能嵌入式数据库,支持 ARM64 NEON SIMD 优化、多级缓存和布隆过滤器 |
| homepage | https://github.com/0ldm0s/melange_db |
| repository | https://github.com/0ldm0s/melange_db |
| max_upload_size | |
| id | 1840964 |
| size | 620,166 |
基于 sled 架构深度优化的下一代高性能嵌入式数据库
Melange DB 是一个基于 sled 架构进行深度性能优化的嵌入式数据库,专注于超越 RocksDB 的性能表现。通过 SIMD 指令优化、智能缓存系统和布隆过滤器等技术,实现极致的读写性能。
项目名称和设计理念深受弗兰克·赫伯特的经典科幻小说《沙丘》(Dune) 启发:
这种灵感来源反映了我们对数据库设计的核心理念:在有限的资源中创造无限的价值。
use melange_db::{Db, Config};
fn main() -> anyhow::Result<()> {
// 配置数据库
let config = Config::new()
.path("/path/to/database")
.cache_capacity_bytes(512 * 1024 * 1024); // 512MB 缓存
// 打开数据库
let db: Db<1024> = config.open()?;
// 写入数据
let tree = db.open_tree("my_tree")?;
tree.insert(b"key", b"value")?;
// 读取数据
if let Some(value) = tree.get(b"key")? {
println!("Found value: {:?}", value);
}
// 范围查询
for kv in tree.range(b"start"..b"end") {
let (key, value) = kv?;
println!("{}: {:?}", String::from_utf8_lossy(&key), value);
}
Ok(())
}
Melange DB 支持通过编译时特性选择压缩算法,以适应不同的性能需求:
use melange_db::{Db, Config, CompressionAlgorithm};
fn main() -> anyhow::Result<()> {
// 无压缩配置 - 追求极致性能
let config = Config::new()
.path("/path/to/database")
.compression_algorithm(CompressionAlgorithm::None) // 无压缩
.cache_capacity_bytes(512 * 1024 * 1024); // 512MB 缓存
let db: Db<1024> = config.open()?;
// 读写操作将获得最佳性能,无压缩开销
let tree = db.open_tree("high_performance_tree")?;
tree.insert(b"key", b"value")?;
Ok(())
}
use melange_db::{Db, Config, CompressionAlgorithm};
fn main() -> anyhow::Result<()> {
// LZ4压缩配置 - 平衡性能和存储效率
let config = Config::new()
.path("/path/to/database")
.compression_algorithm(CompressionAlgorithm::Lz4) // LZ4压缩
.cache_capacity_bytes(512 * 1024 * 1024); // 512MB 缓存
let db: Db<1024> = config.open()?;
// 获得良好的压缩率,同时保持较高性能
let tree = db.open_tree("balanced_tree")?;
tree.insert(b"key", b"value")?;
Ok(())
}
use melange_db::{Db, Config, CompressionAlgorithm};
fn main() -> anyhow::Result<()> {
// Zstd压缩配置 - 追求最大压缩率
let config = Config::new()
.path("/path/to/database")
.compression_algorithm(CompressionAlgorithm::Zstd) // Zstd压缩
.cache_capacity_bytes(512 * 1024 * 1024); // 512MB 缓存
let db: Db<1024> = config.open()?;
// 获得最高的压缩率,适合存储受限场景
let tree = db.open_tree("storage_efficient_tree")?;
tree.insert(b"key", b"value")?;
Ok(())
}
use melange_db::config::CompressionAlgorithm;
fn main() -> anyhow::Result<()> {
// 检查启用的压缩特性
let features = CompressionAlgorithm::detect_enabled_features();
println!("启用的压缩特性: {:?}", features);
// 验证特性配置
if let Some(warning) = CompressionAlgorithm::validate_feature_config() {
println!("警告: {}", warning);
}
// 获取实际使用的算法
let (algorithm, reason) = CompressionAlgorithm::get_active_algorithm_with_reason();
println!("使用压缩算法: {:?}, 原因: {}", algorithm, reason);
Ok(())
}
use melange_db::{Db, Config};
fn main() -> anyhow::Result<()> {
// 生产环境推荐配置
let mut config = Config::new()
.path("/path/to/database")
.cache_capacity_bytes(1024 * 1024 * 1024) // 1GB 缓存
.flush_every_ms(Some(1000)); // 1秒 flush 间隔
// 启用智能 flush 策略
config.smart_flush_config.enabled = true;
config.smart_flush_config.base_interval_ms = 1000;
config.smart_flush_config.min_interval_ms = 100;
config.smart_flush_config.max_interval_ms = 5000;
config.smart_flush_config.write_rate_threshold = 5000;
config.smart_flush_config.accumulated_bytes_threshold = 8 * 1024 * 1024; // 8MB
let db: Db<1024> = config.open()?;
// 使用有意义的树名
let users_tree = db.open_tree("users")?;
let sessions_tree = db.open_tree("sessions")?;
Ok(())
}
我们提供了多个示例来帮助您更好地使用 Melange DB:
performance_demo.rs - 基本性能演示和智能 flush 策略展示accurate_timing_demo.rs - 精确计时分析,包含 P50/P95/P99 统计best_practices.rs - 完整的生产环境使用示例,包含:
rat_logger_demo.rs - 展示如何集成 rat_logger 日志系统:
示例代码优化目标: 当前示例主要针对 Apple M1 等高端 ARM64 设备优化,配置了较大的缓存(1GB)和适用于高性能场景的参数。
低端设备优化建议: 如果您需要在 Intel Celeron J1800 等低端 x86 设备上运行,请参考:
tests/low_end_x86_perf_test.rs# 运行基本性能演示
cargo run --example performance_demo
# 运行精确计时分析
cargo run --example accurate_timing_demo
# 运行最佳实践示例
cargo run --example best_practices
# 运行日志系统集成示例
cargo run --example rat_logger_demo
# 运行压缩算法性能对比(需要指定压缩特性)
cargo run --example macbook_air_m1_compression_none --features compression-none --release
cargo run --example macbook_air_m1_compression_lz4 --features compression-lz4 --release
cargo run --example macbook_air_m1_compression_zstd --features compression-zstd --release
// 针对 Intel Celeron J1800 + 2GB 内存的优化配置
let mut config = Config::new()
.path("low_end_db")
.flush_every_ms(None) // 禁用传统自动flush,使用智能flush
.cache_capacity_bytes(32 * 1024 * 1024); // 32MB缓存,适应2GB内存
// 优化智能flush配置
config.smart_flush_config = crate::smart_flush::SmartFlushConfig {
enabled: true,
base_interval_ms: 100, // 100ms基础间隔
min_interval_ms: 30, // 30ms最小间隔
max_interval_ms: 1500, // 1.5s最大间隔
write_rate_threshold: 4000, // 4K ops/sec阈值
accumulated_bytes_threshold: 2 * 1024 * 1024, // 2MB累积阈值
};
✅ 配置优化: 展示如何根据应用场景调整缓存和 flush 参数 ✅ 数据建模: 演示结构化数据的存储和查询模式 ✅ 批量操作: 介绍高效的数据插入和处理技巧 ✅ 查询优化: 展示范围查询和前缀查询的最佳实践 ✅ 事务处理: 演示如何保证数据一致性 ✅ 性能监控: 提供性能统计和监控建议
详细的性能测试数据和硬件环境信息请查看:docs/test_data/index.md
缓存大小设置
智能 Flush 策略
树的设计
硬件适配建议
tests/low_end_x86_perf_test.rs 配置tests/raspberry_pi_perf_test.rs 配置批量操作
查询优化
数据管理
开发环境
生产环境
测试策略
Melange DB 现已集成 rat_logger 高性能日志系统,提供灵活的日志配置选项:
use melange_db::{Db, Config};
use rat_logger::{LoggerBuilder, LevelFilter, handler::term::TermConfig};
fn main() -> anyhow::Result<()> {
// 初始化日志系统 - 由调用者配置
LoggerBuilder::new()
.add_terminal_with_config(TermConfig::default())
.with_level(LevelFilter::Debug)
.init()?;
// 配置并打开数据库
let config = Config::new()
.path("example_db")
.cache_capacity_bytes(1024 * 1024); // 1MB 缓存
let db: Db<1024> = config.open()?;
// 数据库操作将自动输出日志
let tree = db.open_tree("my_tree")?;
tree.insert(b"key", b"value")?;
Ok(())
}
use rat_logger::{LoggerBuilder, LevelFilter, handler::{
term::TermConfig,
file::FileConfig,
composite::CompositeHandler
}};
// 同时输出到终端和文件
let mut handler = CompositeHandler::new();
handler.add_handler(Box::new(TermProcessor::new(TermConfig::default())?));
handler.add_handler(Box::new(FileProcessor::new(FileConfig {
file_path: "melange_db.log".to_string(),
rotation_size_mb: 100,
max_files: 5,
})?));
LoggerBuilder::new()
.add_custom_handler(handler)
.with_level(LevelFilter::Info)
.init()?;
未初始化日志时的行为:
这种设计确保了:
// 即使不初始化日志,以下代码也能正常运行
use melange_db::{Db, Config};
fn main() -> anyhow::Result<()> {
// 注意:这里没有初始化rat_logger!
let config = Config::new()
.path("example_db")
.cache_capacity_bytes(1024 * 1024);
let db: Db<1024> = config.open()?;
let tree = db.open_tree("my_tree")?;
tree.insert(b"key", b"value")?; // 日志调用被静默忽略
Ok(())
}
Melange DB 支持通过编译时特性选择压缩算法,以适应不同的性能需求:
cargo build --release
cargo build --release --features compression-lz4
cargo build --release --features compression-zstd
如果同时启用多个压缩特性,将按以下优先级选择:none > lz4 > zstd
use melange_db::config::CompressionAlgorithm;
// 检查启用的压缩特性
let features = CompressionAlgorithm::detect_enabled_features();
println!("启用的压缩特性: {:?}", features);
// 验证特性配置
if let Some(warning) = CompressionAlgorithm::validate_feature_config() {
println!("警告: {}", warning);
}
// 获取实际使用的算法
let (algorithm, reason) = CompressionAlgorithm::get_active_algorithm_with_reason();
println!("使用压缩算法: {:?}, 原因: {}", algorithm, reason);
欢迎提交 Issue 和 Pull Request!
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)本项目采用 GNU Lesser General Public License v3.0 (LGPLv3) 许可证 - 查看 LICENSE 文件了解详情。
选择 LGPLv3 的原因:
"I must not fear. Fear is the mind-killer." - Frank Herbert, Dune