Rust数据库操作库br-db的使用:高性能嵌入式存储引擎与键值管理解决方案

Rust数据库操作库br-db的使用:高性能嵌入式存储引擎与键值管理解决方案

br-db ORM 数据库

License Crates.io Version

支持数据库

  • Mysql
  • Sqlite
  • Mssql
  • PostgreSQL as pgsql

安装

在项目目录中运行以下Cargo命令:

cargo add br-db

或者在Cargo.toml中添加以下行:

br-db = "1.8.21"

示例代码

以下是一个完整的br-db使用示例,展示了如何连接SQLite数据库并进行基本的键值操作:

use br_db::{Database, DatabaseType, Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    // 创建SQLite数据库连接
    let db = Database::new(DatabaseType::Sqlite, "test.db").await?;
    
    // 插入键值对
    db.put("my_key", "my_value").await?;
    
    // 获取值
    let value = db.get("my_key").await?;
    println!("获取的值: {:?}", value);  // 输出: Some("my_value")
    
    // 删除键
    db.delete("my_key").await?;
    
    // 检查键是否存在
    let exists = db.exists("my_key").await?;
    println!("键是否存在: {}", exists);  // 输出: false
    
    Ok(())
}

完整示例demo

以下是一个更完整的示例,展示了br-db的更多功能:

use br_db::{Database, DatabaseType, Error};
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
struct User {
    id: u32,
    name: String,
    email: String,
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    // 创建SQLite数据库连接
    let db = Database::new(DatabaseType::Sqlite, "users.db").await?;
    
    // 创建用户数据
    let user = User {
        id: 1,
        name: "张三".to_string(),
        email: "zhangsan@example.com".to_string(),
    };
    
    // 序列化用户数据并存储
    let user_json = serde_json::to_string(&user)?;
    db.put("user:1", &user_json).await?;
    
    // 批量插入数据
    let users = vec![
        ("user:2", r#"{"id":2,"name":"李四","email":"lisi@example.com"}"#),
        ("user:3", r#"{"id":3,"name":"王五","email":"wangwu@example.com"}"#),
    ];
    
    for (key, value) in users {
        db.put(key, value).await?;
    }
    
    // 获取所有用户键
    let keys = db.keys("user:").await?;
    println!("所有用户键: {:?}", keys);
    
    // 获取并反序列化用户数据
    if let Some(user_data) = db.get("user:1").await? {
        let user: User = serde_json::from_str(&user_data)?;
        println!("用户1: {:?}", user);
    }
    
    // 删除用户数据
    db.delete("user:3").await?;
    
    // 事务示例
    db.transaction(|tx| {
        tx.put("tx_key1", "tx_value1")?;
        tx.put("tx_key2", "tx_value2")?;
        Ok(())
    }).await?;
    
    Ok(())
}

特性说明

br-db是一个高性能的嵌入式存储引擎与键值管理解决方案,提供以下特性:

  1. 支持多种数据库后端
  2. 简单的键值存储API
  3. 异步操作支持
  4. 轻量级设计

文档

更多详细使用方法请参考官方文档。

许可证

MIT License


1 回复

Rust数据库操作库br-db的使用:高性能嵌入式存储引擎与键值管理解决方案

简介

br-db是一个高性能的嵌入式键值存储引擎,专为Rust语言设计。它提供了简单易用的API,同时保持了出色的性能表现,特别适合需要本地存储的场景。

主要特性

  • 嵌入式设计:无需额外数据库服务
  • 键值存储:简单的键值数据模型
  • 高性能:优化的存储引擎实现
  • ACID事务支持
  • 线程安全

安装

在Cargo.toml中添加依赖:

[dependencies]
br-db = "0.1"  # 请使用最新版本号

基本使用方法

1. 打开数据库

use br_db::Database;

fn main() -> Result<(), br_db::Error> {
    // 打开或创建数据库
    let db = Database::open("my_database.db")?;
    
    Ok(())
}

2. 基本CRUD操作

use br_db::Database;

fn main() -> Result<(), br_db::Error> {
    let db = Database::open("example.db")?;
    
    // 插入数据
    db.put(b"key1", b"value1")?;
    db.put(b"key2", b"value2")?;
    
    // 读取数据
    if let Some(value) = db.get(b"key1")? {
        println!("Got value: {:?}", String::from_utf8_lossy(&value));
    }
    
    // 删除数据
    db.delete(b"key2")?;
    
    // 检查是否存在
    println!("Exists: {}", db.contains_key(b"key1")?);
    
    Ok(())
}

3. 批量操作

use br_db::Database;

fn main() -> Result<(), br_db::Error> {
    let db = Database::open("batch.db")?;
    
    // 批量写入
    let mut batch = db.batch();
    batch.put(b"bat1", b"value1");
    batch.put(b"bat2", b"value2");
    batch.delete(b"key_to_remove");
    batch.commit()?;
    
    Ok(())
}

4. 事务处理

use br_db::{Database, Transaction};

fn main() -> Result<(), br_db::Error> {
    let db = Database::open("transaction.db")?;
    
    // 开始事务
    let tx = db.transaction()?;
    
    tx.put(b"tx_key1", b"tx_value1")?;
    tx.put(b"tx_key2", b"tx_value2")?;
    
    // 提交事务
    tx.commit()?;
    
    // 或者回滚
    // tx.rollback()?;
    
    Ok(())
}

5. 迭代器使用

use br_db::Database;

fn main() -> Result<(), br_db::Error> {
    let db = Database::open("iterator.db")?;
    
    // 填充一些测试数据
    for i in 0..10 {
        db.put(format!("key{}", i).as_bytes(), format!("value{}", i).as_bytes())?;
    }
    
    // 使用迭代器遍历
    let mut iter = db.iter()?;
    while let Some((key, value)) = iter.next() {
        println!(
            "Key: {}, Value: {}",
            String::from_utf8_lossy(&key),
            String::from_utf8_lossy(&value)
        );
    }
    
    Ok(())
}

高级功能

自定义比较器

use br_db::{Database, Options};

fn main() -> Result<(), br_db::Error> {
    let mut options = Options::default();
    options.comparator = Some(Box::new(|a, b| b.cmp(a))); // 反向排序
    
    let db = Database::open_with_options("custom_compare.db", options)?;
    
    // ... 使用数据库 ...
    
    Ok(())
}

性能调优

use br_db::{Database, Options};

fn main() -> Result<(), br_db::Error> {
    let mut options = Options::default();
    options.cache_size = 1024 * 1024 * 100; // 100MB缓存
    options.write_buffer_size = 1024 * 1024 * 4; // 4MB写缓冲区
    
    let db = Database::open_with_options("tuned.db", options)?;
    
    // ... 使用数据库 ...
    
    Ok(())
}

完整示例

下面是一个整合了br-db主要功能的完整示例:

use br_db::{Database, Options, Transaction};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // 1. 打开数据库
    let mut options = Options::default();
    options.cache_size = 1024 * 1024 * 10; // 10MB缓存
    
    let db = Database::open_with_options("complete_example.db", options)?;
    
    // 2. 基本CRUD操作
    println!("=== 基本CRUD操作 ===");
    db.put(b"name", b"Alice")?;
    db.put(b"age", b"30")?;
    
    if let Some(name) = db.get(b"name")? {
        println!("Name: {}", String::from_utf8_lossy(&name));
    }
    
    println!("Contains 'age': {}", db.contains_key(b"age")?);
    db.delete(b"age")?;
    println!("After delete, contains 'age': {}", db.contains_key(b"age")?);
    
    // 3. 批量操作
    println!("\n=== 批量操作 ===");
    let mut batch = db.batch();
    batch.put(b"batch1", b"value1");
    batch.put(b"batch2", b"value2");
    batch.delete(b"name");
    batch.commit()?;
    
    // 4. 事务处理
    println!("\n=== 事务处理 ===");
    let tx = db.transaction()?;
    tx.put(b"tx1", b"tx_value1")?;
    tx.put(b"tx2", b"tx_value2")?;
    // 模拟事务失败场景可以取消下面这行注释
    // return Ok(());
    tx.commit()?;
    
    // 5. 迭代器使用
    println!("\n=== 迭代器遍历 ===");
    let mut iter = db.iter()?;
    while let Some((key, value)) = iter.next() {
        println!(
            "Key: {}, Value: {}",
            String::from_utf8_lossy(&key),
            String::from_utf8_lossy(&value)
        );
    }
    
    // 6. 自定义比较器
    println!("\n=== 自定义比较器 ===");
    let mut custom_options = Options::default();
    custom_options.comparator = Some(Box::new(|a, b| b.cmp(a)));
    
    let custom_db = Database::open_with_options("custom_sort.db", custom_options)?;
    custom_db.put(b"a", b"1")?;
    custom_db.put(b"b", b"2")?;
    custom_db.put(b"c", b"3")?;
    
    let mut custom_iter = custom_db.iter()?;
    while let Some((key, _)) = custom_iter.next() {
        println!("Key (reverse order): {}", String::from_utf8_lossy(&key));
    }
    
    Ok(())
}

注意事项

  1. br-db是嵌入式数据库,不需要额外服务进程
  2. 所有操作都是同步的,考虑在性能敏感场景中使用异步包装
  3. 数据库文件是平台相关的,不能直接在不同平台间迁移
  4. 定期备份重要数据

br-db为Rust开发者提供了一个简单高效的本地存储解决方案,特别适合配置存储、缓存、状态持久化等场景。

回到顶部