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数据库接口

Download history 143/week @ 2024-04-08 89/week @ 2024-04-15 423/week @ 2024-04-22 379/week @ 2024-04-29 262/week @ 2024-05-06 109/week @ 2024-05-13 275/week @ 2024-05-20 345/week @ 2024-05-27 661/week @ 2024-06-03 1000/week @ 2024-06-10 1062/week @ 2024-06-17 792/week @ 2024-06-24 1172/week @ 2024-07-01 960/week @ 2024-07-08 652/week @ 2024-07-15 986/week @ 2024-07-22

每月 3,776 次下载
2 个包 中使用

MIT/Apache 许可协议

180KB
3.5K SLoC

jammdb

另一个内存映射数据库

crates.io docs.rs Build status Coverage Status License Dependency Status

jammdb 是一个嵌入式、单文件数据库,允许您将键/值对存储为字节。

它最初是 Ben Johnson 的 BoltDB 的 Rust 版本,该版本受到了 Howard ChuLMDB 的启发,因此请查看这两个出色的项目!

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