9 次重大发布
0.11.0 | 2023年11月4日 |
---|---|
0.10.0 | 2023年6月16日 |
0.9.0 | 2023年1月24日 |
0.6.0 | 2022年12月15日 |
0.3.1 | 2020年6月11日 |
#268 在 数据库接口
每月 3,776 次下载
在 2 个包 中使用
180KB
3.5K SLoC
jammdb
另一个内存映射数据库
jammdb
是一个嵌入式、单文件数据库,允许您将键/值对存储为字节。
它最初是 Ben Johnson 的 BoltDB 的 Rust 版本,该版本受到了 Howard Chu 的 LMDB 的启发,因此请查看这两个出色的项目!
jammdb
提供了 ACID 兼容性,可序列化 和 隔离 事务,具有多个无锁读取器和单个并发写入器。数据以 单级 B+树 组织,因此随机和顺序读取非常快。底层文件是 内存映射 的,因此读取不需要额外的内存分配。
支持的平台
jammdb
在以下平台上持续交叉编译和测试
x86_64-unknown-linux-gnu
(Linux)i686-unknown-linux-gnu
x86_64-unknown-linux-musl
(Linux MUSL)x86_64-apple-darwin
(OSX)x86_64-pc-windows-msvc
(Windows)i686-pc-windows-msvc
x86_64-pc-windows-gnu
i686-pc-windows-gnu
示例
以下是一些简单的示例以供您开始,但您应该查看文档以获取更多详细信息。
简单的 put 和 get
use jammdb::{DB, Data, Error};
fn main() -> Result<(), Error> {
{
// open a new database file
let db = DB::open("my-database.db")?;
// open a writable transaction so we can make changes
let tx = db.tx(true)?;
// create a bucket to store a map of first names to last names
let names_bucket = tx.create_bucket("names")?;
names_bucket.put("Kanan", "Jarrus")?;
names_bucket.put("Ezra", "Bridger")?;
// commit the changes so they are saved to disk
tx.commit()?;
}
{
// open the existing database file
let db = DB::open("my-database.db")?;
// open a read-only transaction to get the data
let tx = db.tx(false)?;
// get the bucket we created in the last transaction
let names_bucket = tx.get_bucket("names")?;
// get the key/ value pair we inserted into the bucket
if let Some(data) = names_bucket.get("Kanan") {
assert!(data.is_kv());
assert_eq!(data.kv().value(), b"Jarrus");
}
}
Ok(())
}
存储结构体
use jammdb::{DB, Data, Error};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct User {
username: String,
password: String,
}
fn main() -> Result<(), Error> {
let user = User{
username: "my-user".to_string(),
password: "my-password".to_string(),
};
{
// open a new database file and start a writable transaction
let db = DB::open("my-database.db")?;
let tx = db.tx(true)?;
// create a bucket to store users
let users_bucket = tx.create_bucket("users")?;
// serialize struct to bytes and store in bucket
let user_bytes = rmp_serde::to_vec(&user).unwrap();
users_bucket.put("user1", user_bytes)?;
// commit the changes so they are saved to disk
tx.commit()?;
}
{
// open the existing database file
let db = DB::open("my-database.db")?;
// open a read-only transaction to get the data
let tx = db.tx(false)?;
// get the bucket we created in the last transaction
let users_bucket = tx.get_bucket("users")?;
// get the key / value pair we inserted into the bucket
if let Some(data) = users_bucket.get("user1") {
if data.is_kv() {
let kv = data.kv();
// deserialize into a user struct
let db_user: User = rmp_serde::from_slice(kv.value()).unwrap();
assert_eq!(db_user, user);
}
}
}
Ok(())
}
MSRV
目前 1.63
许可证
可在 Apache 许可协议 或 MIT 许可协议 下使用。
依赖项
~3–12MB
~126K SLoC