rustbreak
前言
持久化就是把数据保存到可掉电式存储设备中以供之后使用。通常是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、xml数据文件中。
介绍
RustBreak是一个简单、快速、线程安全的轻量数据库。开箱即用,你只要关心存储内容。
RustBreak支持三种数据序列化方式:ron、bincode 、yaml。
在某个应用程序中,将对部分数据持久化操作,并且任意数据格式的,可以考虑使用这个库。
使用
通用流程:
- 创建或打开数据库。 可以是文件数据库、内容数据库、Mmap数据库等。
- 对数据库的读写操作。
- 同步数据库。
实例
实验目的,持久化HashMap数据到文件中。
在cargo.toml
文件中添加包:
[dependencies]
failure = "0.1.6"
serde = "1.0.23"
rustbreak = { git = "https://github.com/TheNeikos/rustbreak", features = ["ron_enc"] }
在main.rs
文件中实现:
use std::{
collections::HashMap,
sync::Arc
};
use serde::{Serialize, Deserialize};
use rustbreak::{
FileDatabase,
deser::Ron
};
#[derive(Eq, PartialEq, Debug, Serialize, Deserialize, Clone)]
enum Country {
Italy, UnitedKingdom
}
#[derive(Eq, PartialEq, Debug, Serialize, Deserialize, Clone)]
struct Person {
name: String,
country: Country,
}
fn main() -> Result<(), failure::Error> {
let db = Arc::new(FileDatabase::<HashMap<String, Person>, Ron>::from_path("test.ron", HashMap::new())?);
println!("Loading Database");
db.load()?;
println!("Writing to Database");
let db1 = db.clone();
let t1 = std::thread::spawn(move || {
db1.write(|db| {
db.insert("fred".into(), Person {
name: String::from("Fred Johnson"),
country: Country::UnitedKingdom
});
}).unwrap();
});
let db2 = db.clone();
let t2 = std::thread::spawn(move || {
db2.write(|db| {
db.insert("john".into(), Person {
name: String::from("John Andersson"),
country: Country::Italy
});
}).unwrap();
});
t1.join().unwrap();
t2.join().unwrap();
println!("Syncing Database");
db.save()?;
db.read(|db| {
println!("Results:");
println!("{:#?}", db.get("john".into()));
})?;
Ok(())
}
首先定义Country
枚举类型和Person
结构,并实现序列化。
接着启动两个线程插入数据。
输出文件:
{
"fred": (
name: "Fred Johnson",
country: UnitedKingdom,
),
"john": (
name: "John Andersson",
country: Italy,
),
}
网友评论