rustbreak
前言
持久化就是把數(shù)據(jù)保存到可掉電式存儲設(shè)備中以供之后使用不皆。通常是將內(nèi)存中的數(shù)據(jù)存儲在關(guān)系型數(shù)據(jù)庫中脸爱,當(dāng)然也可以存儲在磁盤文件业岁、xml數(shù)據(jù)文件中。
介紹
RustBreak是一個(gè)簡單纬乍、快速第晰、線程安全的輕量數(shù)據(jù)庫锁孟。開箱即用,你只要關(guān)心存儲內(nèi)容茁瘦。
RustBreak支持三種數(shù)據(jù)序列化方式:ron品抽、bincode 、yaml腹躁。
在某個(gè)應(yīng)用程序中桑包,將對部分?jǐn)?shù)據(jù)持久化操作,并且任意數(shù)據(jù)格式的纺非,可以考慮使用這個(gè)庫哑了。
使用
通用流程:
- 創(chuàng)建或打開數(shù)據(jù)庫。 可以是文件數(shù)據(jù)庫烧颖、內(nèi)容數(shù)據(jù)庫弱左、Mmap數(shù)據(jù)庫等。
- 對數(shù)據(jù)庫的讀寫操作炕淮。
- 同步數(shù)據(jù)庫拆火。
實(shí)例
實(shí)驗(yàn)?zāi)康模志没疕ashMap數(shù)據(jù)到文件中涂圆。
在cargo.toml
文件中添加包:
[dependencies]
failure = "0.1.6"
serde = "1.0.23"
rustbreak = { git = "https://github.com/TheNeikos/rustbreak", features = ["ron_enc"] }
在main.rs
文件中實(shí)現(xiàn):
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
結(jié)構(gòu)们镜,并實(shí)現(xiàn)序列化。
接著啟動兩個(gè)線程插入數(shù)據(jù)润歉。
輸出文件:
{
"fred": (
name: "Fred Johnson",
country: UnitedKingdom,
),
"john": (
name: "John Andersson",
country: Italy,
),
}