Sled简介

Sled是一个用纯Rust实现的嵌入式键值数据库,它具有以下特点:

  • 纯Rust实现,保证内存安全
  • 嵌入式设计,无需独立服务器
  • 类Redis的键值对存储
  • 本地文件持久化
  • 高性能和可靠性

与传统数据库的区别

传统数据库(如MySQL)

  • 需要独立的数据库服务器
  • 需要开放网络端口
  • 客户端-服务器架构
  • 支持复杂的SQL查询

嵌入式数据库(如Sled)

  • 直接嵌入应用程序
  • 使用本地文件存储
  • 无需网络连接
  • 简单的键值对操作

基本使用

1. 添加依赖

1
2
[dependencies]
sled = "0.34"

2. 打开数据库

1
2
3
4
5
6
7
use sled::Db;

fn main() -> sled::Result<()> {
// 打开数据库,如果不存在会自动创建
let db = sled::open("data/blocks")?;
Ok(())
}

3. 基本操作

存储数据

1
2
3
4
5
// 插入键值对
db.insert("key", "value")?;

// 使用字节数组
db.insert(b"key", b"value")?;

读取数据

1
2
3
4
5
// 获取值
match db.get("key")? {
Some(value) => println!("找到值: {:?}", value),
None => println!("未找到值"),
}

删除数据

1
2
// 删除键值对
db.remove("key")?;

持久化

1
2
// 确保数据写入磁盘
db.flush()?;

高级特性

1. 原子操作

1
2
// 比较并设置
db.compare_and_swap("key", Some("old"), Some("new"))?;

2. 批量操作

1
2
3
4
5
let batch = sled::Batch::default()
.insert(b"k1", b"v1")
.insert(b"k2", b"v2")
.remove(b"k3");
db.apply_batch(batch)?;

3. 事务支持

1
2
3
4
5
6
let tree = db.open_tree("my_tree")?;
tree.transaction(|tree| {
tree.insert("key1", "value1")?;
tree.insert("key2", "value2")?;
Ok(())
})?;