Rust键值存储库surrealkv的使用,高性能分布式KV存储引擎surrealkv助力数据持久化

Rust键值存储库surrealkv的使用,高性能分布式KV存储引擎surrealkv助力数据持久化

功能特性

surrealkv是一个用Rust实现的版本化、低层级、持久化、嵌入式键值数据库,具有以下特性:

ACID兼容:支持原子性、一致性、隔离性和持久性
🔄 丰富的事务支持:支持多插入、更新和删除的原子操作
🔒 隔离级别:可选择快照隔离或可序列化快照隔离
💾 持久性保证:提供持久化存储,防止系统故障
📦 嵌入式数据库:轻松集成到Rust应用中
🔄 MVCC支持:使用版本化自适应基数树实现非阻塞并发读写
📚 内置版本控制:跟踪和访问数据的历史版本
🗜️ 压缩功能:通过压缩实现高效存储管理

快速入门示例

use surrealkv::{Store, Options};
use bytes::Bytes;

// 创建新存储
let mut opts = Options::new();
opts.dir = "path/to/db".into();
let store = Store::new(opts).expect("failed to create store");

// 开始读写事务
let mut txn = store.begin().unwrap();

// 设置键值对
let key = Bytes::from("hello");
let value = Bytes::from("world");
txn.set(&key, &value).unwrap();

// 提交事务
txn.commit().unwrap();

完整示例代码

use surrealkv::{Store, Options, IsolationLevel};
use bytes::Bytes;

fn main() {
    // 配置数据库选项
    let mut opts = Options::new();
    opts.dir = "./data".into();                    // 数据库目录路径
    opts.disk_persistence = true;                  // 启用磁盘持久化
    opts.max_value_threshold = 4096;               // 小于此大小的值存储在内存中
    opts.max_segment_size = 268_435_456;           // 256MB段大小
    opts.isolation_level = IsolationLevel::Snapshot; // 快照隔离级别
    opts.enable_versions = true;                   // 启用版本控制
    
    // 创建存储实例
    let store = Store::new(opts).expect("创建存储失败");
    
    // 写入事务
    {
        let mut txn = store.begin().unwrap();
        
        // 设置多个键值对
        let key1 = Bytes::from("user:1");
        let value1 = Bytes::from(r#"{"name":"Alice","age":30}"#);
        
        let key2 = Bytes::from("user:2");
        let value2 = Bytes::from(r#"{"name":"Bob","age":25}"#);
        
        txn.set(&key1, &value1).unwrap();
        txn.set(&key2, &value2).unwrap();
        
        // 提交事务
        txn.commit().unwrap();
    }
    
    // 读取事务
    {
        let mut txn = store.begin().unwrap();
        
        // 获取单个键值
        let key = Bytes::from("user:1");
        if let Some(value) = txn.get(&key).unwrap() {
            println!("获取的值: {:?}", String::from_utf8_lossy(&value));
        }
        
        // 范围扫描
        let range = Bytes::from("user:")..Bytes::from("user:~");
        let results = txn.scan(range, Some(极光);
        for (k, v) in results {
            println!("扫描结果 - 键: {:?}, 值: {:?}", 
                String::from_utf8_lossy(&k), 
                String::from_utf8_lossy(&v));
        }
    }
    
    // 版本控制操作
    {
        let mut txn = store.begin().unwrap();
        
        // 获取特定时间戳的版本
        let timestamp = std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap()
            .as_secs();
            
        if let Ok(value) = txn.get_at_version(b"user:1", timestamp) {
            println!("版本值: {:?}", value);
        }
        
        // 获取键的完整历史
        if let Ok(history)极光 txn.get_all_versions(b"user:1") {
            for (ts, val) in history {
                println!("历史版本 - 时间戳: {}, 值: {:?}", ts, val);
            }
        }
    }
    
    // 关闭存储
    store.close().unwrap();
}

配置选项

let mut opts = Options::new();

// 必填配置
opts.dir = "path/to/db".into();                    // 数据库目录路径

// 存储配置
opts.disk_persistence = true;                      // false表示仅内存操作
opts.max_value_threshold = 4096;                   // 小于此大小的值存储在内存中
opts.max_segment_size = 268_435_456;               // 256MB段大小
opts.max_compaction_segment_size = 1_073_741_824;  // 1GB最大压缩段

// 事务和版本控制
opts.isolation_level = IsolationLevel::Snapshot;   // 控制事务隔离级别
opts.enable_versions = true;                       // 启用/禁用版本控制

// 缓存设置
opts.max_value_cache_size = 10000;                 // 可以缓存的值数量,避免磁盘查找

let store = Store::new(opts).expect("创建存储失败");

高级特性

持久性级别

// 设置事务持久性为Eventual(默认)
tx.set_durability(Durability::Eventual);

// 设置事务持久性为Immediate
tx.set_durability(Durability::Immediate);

自定义查询

// 使用自定义查询类型进行特定查找
let result = tx.get_value_by_query(&key, QueryType::LatestByTs)?;

性能特点

surrealkv具有以下性能特点:

  1. 延迟特性

    • 由于直接偏移量查找,检索操作具有恒定时间
    • 写入延迟受顺序I/O性能限制
    • 正常操作期间磁盘寻道最少
  2. 吞吐量属性

    • 顺序写入模式最大化I/O带宽利用率
    • 并发读取操作随可用CPU核心扩展
    • 范围查询受益于trie的前缀组织
  3. 恢复语义

    • 初始启动需要完整段扫描以重建索引
    • 恢复时间与所有段的总大小成正比
    • CRC验证确保恢复期间的数据完整性

使用场景

最佳用例

  • 写入密集型工作负载
  • 点查询主导模式
  • 基于前缀的访问模式
  • 需要版本跟踪的时间序列数据

不适用场景

  • 内存受限环境
  • 非常大的键空间
  • 扫描密集型工作负载
  • 对大型数据集的随机更新

许可证

采用Apache License 2.0授权


1 回复

Rust键值存储库surrealkv的使用指南

介绍

surrealkv是一个高性能的分布式键值存储引擎,专为Rust生态系统设计。它提供了持久化存储能力,适合需要快速、可靠键值存储的应用场景。

surrealkv的主要特点:

  • 高性能读写操作
  • 分布式架构支持
  • 数据持久化
  • 简单的API接口
  • Rust原生支持

安装

在Cargo.toml中添加依赖:

[dependencies]
surrealkv = "0.1"  # 请使用最新版本

基本使用方法

1. 创建和打开数据库

use surrealkv::Store;

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

2. 基本CRUD操作

use surrealkv::Store;

fn main() -> Result<(), surrealkv::Error> {
    let mut store = Store::open("my_database.db")?;
    
    // 插入数据
    store.put("key1", "value1")?;
    store.put("key2", "value2")?;
    
    // 读取数据
    if let Some(value) = store.get("key1")? {
        println!("Got value: {}", value);
    }
    
    // 删除数据
    store.delete("key1")?;
    
    // 检查是否存在
    println!("Key exists: {}", store.contains("key2")?);
    
    Ok(())
}

3. 批量操作

use surrealkv::Store;

fn main() -> Result<(), surrealkv::Error> {
    let mut store = Store::open("my_database.db")?;
    
    // 批量插入
    let mut batch = store.batch();
    batch.put("batch_key1", "batch_value1");
    batch.put("batch_key2", "batch_value2");
    batch.delete("key_to_remove");
    store.execute(batch)?;
    
    Ok(())
}

4. 迭代器使用

use surrealkv::Store;

fn main() -> Result<(), surrealkv::Error> {
    let store = Store::open("my_database.db")?;
    
    // 遍历所有键值对
    for item in store.iter() {
        let (key, value) = item?;
        println!("{}: {}", key, value);
    }
    
    // 范围查询
    for item in store.range("a".."m") {
        let (key, value) = item?;
        println!("In range {}: {}", key, value);
    }
    
    Ok(())
}

高级功能

分布式设置

use surrealkv::{Cluster, Store};

async fn distributed_example() -> Result<(), surrealkv::Error> {
    // 创建集群配置
    let config = Cluster::config()
        .add_node("node1", "127.0.0.1:8080")
        .add_node("node2", "127.0.0.1:8081")
        .build();
    
    // 加入集群
    let cluster = Cluster::join(config).await?;
    
    // 获取分布式存储接口
    let store = cluster.store("my_distributed_db").await?;
    
    // 使用方式与本地存储相同
    store.put("dist_key", "dist_value")?;
    
    Ok(())
}

事务支持

use surrealkv::Store;

fn transaction_example() -> Result<(), surrealkv::Error> {
    let mut store = Store::open("transaction_db.db")?;
    
    // 开始事务
    let mut tx = store.transaction()?;
    
    tx.put("tx_key1", "tx_value1")?;
    tx.put("tx_key2", "tx_value2")?;
    
    // 提交事务
    tx.commit()?;
    
    Ok(())
}

性能调优

use surrealkv::{Options, Store};

fn performance_tuning() -> Result<(), surrealkv::Error> {
    // 自定义配置
    let options = Options::default()
        .cache_size(1024 * 1024 * 256) // 256MB缓存
        .compression(true)
        .sync_write(false); // 异步写入提高性能
    
    let store = Store::with_options("perf_db.db", options)?;
    
    // ... 使用store
    
    Ok(())
}

完整示例

以下是一个结合了基本CRUD操作、批量操作和迭代器使用的完整示例:

use surrealkv::Store;

fn main() -> Result<(), surrealkv::Error> {
    // 打开或创建数据库
    let mut store = Store::open("example_db.db")?;
    
    // 基本CRUD操作
    println!("=== 基本CRUD操作 ===");
    store.put("name", "Alice")?;
    store.put("age", "30")?;
    
    if let Some(name) = store.get("name")? {
        println!("Name: {}", name);
    }
    
    println!("Age exists: {}", store.contains("age")?);
    
    // 批量操作
    println!("\n=== 批量操作 ===");
    let mut batch = store.batch();
    batch.put("city", "Beijing");
    batch.put("country", "China");
    batch.delete("age");
    store.execute(batch)?;
    
    // 迭代器使用
    println!("\n=== 迭代器遍历 ===");
    for item in store.iter() {
        let (key, value) = item?;
        println!("{}: {}", key, value);
    }
    
    // 范围查询
    println!("\n=== 范围查询 ===");
    for item in store.range("a".."n") {
        let (key, value) = item?;
        println!("In range {}: {}", key, value);
    }
    
    // 清理
    store.delete("name")?;
    store.delete("city")?;
    store.delete("country")?;
    
    Ok(())
}

注意事项

  1. 确保在不需要时关闭存储以释放资源
  2. 分布式模式下需要处理网络分区和节点故障
  3. 大型数据库可能需要定期压缩
  4. 考虑备份重要数据

surrealkv为Rust应用提供了强大的键值存储解决方案,适合从嵌入式系统到分布式服务的各种场景。

回到顶部