10 个版本
0.2.9 | 2023年1月2日 |
---|---|
0.2.8 | 2021年12月5日 |
0.2.6 | 2021年2月7日 |
0.2.5 | 2021年1月12日 |
0.1.0 | 2020年5月12日 |
#1169 在 数据库接口 中
每月下载量:162
在 ioddengine 中使用
35KB
470 行
microkv
一个以安全性为设计重点的最小化持久化键值存储。
介绍
microkv 是一个以安全性为设计重点的最小化持久化键值存储,旨在优先考虑客户端应用的 secure 存储需求。我创建这个项目是为了深入了解分布式系统、数据库和 secure 持久存储的复杂性。
虽然 microkv 不应该用于支持巨大交易量的大型环境,但它仍然适用于可能不需要完整数据库或像 Redis 或 LevelDB 这样的行业标准 KV 存储的生产级系统/应用程序。
特性
- 性能优良
microkv 的底层映射结构基于 @bluss 的 indexmap 实现,其性能与内置的 HashMap
的摊销常量运行时间相当,但也可以提供类似 BTreeMap
的低性能的排序键迭代。这提供了性能和功能之间良好的平衡。
在读取和写入磁盘时,键值存储使用 bincode
对底层结构进行快速的反序列化和序列化,使用户可以插入任何可序列化的结构而无需担心存储复杂数据结构的开销。
- 安全
microkv 几乎像安全区域一样处理任何存储的信息。首先,插入的值使用来自 sodiumoxide
的 XSalsa20(流密码)和 Poly1305(HMAC)进行认证加密,保证安全性和完整性。内存中的加密值也使用 mlock
进行内存锁定,并在销毁时安全地归零,以避免在内存页面中持久化。
microkv 还提供了使用 RwLock
的锁定支持,它利用互斥锁,但在并发读锁可以持有,但一次只能持有一个写锁的情况下更稳健。这有助于消除线程安全和数据竞争的担忧,同时也允许安全地进行多次读取访问。
- 小巧
在核心上,microkv 实现了大约500行代码,使其实现具有可移植性和可审计性。它始终保持自己的观点,这意味着它不会提供对其他可序列化格式的扩展或任何其他用户参与的配置性,从而使其能够直接使用。
用法
要本地安装,只需克隆存储库并使用 cargo
安装。
# .. from crates.io
$ cargo install microkv
# .. or locally
$ git clone https://github.com/ex0dus-0x/microkv
$ cargo install --path .
以下是 microkv
库的示例用法。
use microkv::MicroKV;
#[derive(Serialize, Deserialize, Debug)]
struct Identity {
uuid: u32,
name: String,
sensitive_data: String,
}
fn main() {
let unsafe_pwd: String = "my_password_123";
// initialize in-memory database with (unsafe) cleartext password
let db: MicroKV = MicroKV::new("my_db")
.with_pwd_clear(unsafe_pwd);
// ... or backed by disk, with auto-commit per transaction
let db: MicroKV = MicroKV::open_with_base_path("my_db_on_disk", SOME_PATH)
.expect("Failed to create MicroKV from a stored file or create MicroKV for this file")
.set_auto_commit(true)
.with_pwd_clear(unsafe_pwd);
// simple interaction to default namespace
db.put("simple", 1);
print("{}", db.get_unwrap("simple").unwrap());
db.delete("simple");
// more complex interaction to default namespace
let identity = Identity {
uuid: 123,
name: String::from("Alice"),
sensitive_data: String::from("something_important_here")
};
db.put("complex", identity);
let stored_identity: Identity = db.get_unwrap("complex").unwrap();
println!("{:?}", stored_identity);
db.delete("complex");
}
microkv 还支持对其他命名空间的事务,以支持对键的分组和组织(感谢 @fewensa!)。
let namespace_one = db.namespace("one");
namespace_one.put("zoo", &"big".to_string()).unwrap();
microkv 还包括一个简单的命令行应用程序,该应用程序与软件包一起安装。虽然目前可能并不完全有用,但未来的计划是将它集成到可以通过 Docker 容器暴露的系统中。
贡献
有兴趣改进这个项目的状态吗?请查看 问题跟踪器,看看我们需要哪些帮助!
许可证
依赖关系
约20MB
约124K SLoC