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具有以下性能特点:
-
延迟特性:
- 由于直接偏移量查找,检索操作具有恒定时间
- 写入延迟受顺序I/O性能限制
- 正常操作期间磁盘寻道最少
-
吞吐量属性:
- 顺序写入模式最大化I/O带宽利用率
- 并发读取操作随可用CPU核心扩展
- 范围查询受益于trie的前缀组织
-
恢复语义:
- 初始启动需要完整段扫描以重建索引
- 恢复时间与所有段的总大小成正比
- 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(())
}
注意事项
- 确保在不需要时关闭存储以释放资源
- 分布式模式下需要处理网络分区和节点故障
- 大型数据库可能需要定期压缩
- 考虑备份重要数据
surrealkv为Rust应用提供了强大的键值存储解决方案,适合从嵌入式系统到分布式服务的各种场景。