26个版本 (14个重大更新)
0.24.0 | 2022年8月25日 |
---|---|
0.23.1 | 2022年2月9日 |
0.22.0 | 2020年9月8日 |
0.20.2 | 2020年3月6日 |
0.4.0 | 2018年3月6日 |
#77 在 数据库实现
每月5,343次下载
在 9 个crate中(8个直接) 使用
43KB
1K SLoC
kv
基于 sled 的Rust嵌入式键值存储
- 易于配置
- 整数键
- Serde集成
注意:版本 kv
0.20
及以上已经完全重写,使用 sled 而不是 LMDB。在此过程中,整个API已经重新设计并显著简化。如果您仍然需要使用LMDB或不喜欢新界面,那么您可能想看看 rkv。
可选功能
msgpack-value
- 使用
rmp-serde
进行MessagePack编码
- 使用
json-value
- 使用
serde_json
进行JSON编码
- 使用
bincode-value
- 使用
bincode
进行bincode编码
- 使用
lexpr-value
- 使用
serde-lexpr
进行S表达式编码
- 使用
文档
lib.rs
:
kv
是将键值存储嵌入Rust应用程序的简单方法。它使用 sled 构建,旨在尽可能轻量级,同时提供良好的高级接口。
入门
use kv::*;
#[derive(serde::Serialize, serde::Deserialize, PartialEq)]
struct SomeType {
a: i32,
b: i32
}
fn run() -> Result<(), Error> {
// Configure the database
let mut cfg = Config::new("./test/example1");
// Open the key/value store
let store = Store::new(cfg)?;
// A Bucket provides typed access to a section of the key/value store
let test = store.bucket::<Raw, Raw>(Some("test"))?;
let key = Raw::from(b"test");
let value = Raw::from(b"123");
// Set test = 123
test.set(&key, &value)?;
assert!(test.get(&key).unwrap().unwrap() == value);
assert!(test.get(&b"something else".into()).unwrap() == None);
// Integer keys
let aaa = store.bucket::<Integer, String>(Some("aaa"))?;
let key = Integer::from(1);
let value = String::from("Testing");
aaa.set(&key, &value);
#[cfg(feature = "json-value")]
{
// Using a Json encoded type is easy, thanks to Serde
let bucket = store.bucket::<&str, Json<SomeType>>(None)?;
let k = "example";
let x = Json(SomeType {a: 1, b: 2});
bucket.set(&k, &x)?;
let x: Json<SomeType> = bucket.get(&k)?.unwrap();
for item in bucket.iter() {
let item = item?;
let key: String = item.key()?;
let value = item.value::<Json<SomeType>>()?;
println!("key: {}, value: {}", key, value);
}
// A transaction
bucket.transaction(|txn| {
txn.set(&"x", &Json(SomeType {a: 1, b: 2}))?;
txn.set(&"y", &Json(SomeType {a: 3, b: 4}))?;
txn.set(&"z", &Json(SomeType {a: 5, b: 6}))?;
Ok(())
})?;
}
Ok(())
}
#
依赖项
~1.9–3.5MB
~66K SLoC