28个版本
0.7.4 | 2023年2月2日 |
---|---|
0.6.2 | 2023年1月4日 |
0.6.0 |
|
0.5.1 | 2021年12月23日 |
0.2.6 | 2021年3月7日 |
#1289 in 数据库接口
用于 imdb-async
41KB
862 行
indexkv
提供[存储],一个磁盘存储桶。从概念上讲,这与一个提供快速(按持久化存储标准)键查找、低内存复杂度以及快速顺序写入(以随机写入为代价;不支持随机写入)的 map<u64, T>
非常相似。有关写入的详细信息,请参阅 Store::write。
虽然并发读取是安全的,但在写入进行时读取则是一个潜在的问题。
示例
使用 Iterator::enumerate 自动键值
use indexkv::Store;
#[tokio::main]
async fn main() {
let path = tempfile::NamedTempFile::new().unwrap().into_temp_path();
let mut store: Store<u8, String> = Store::new(path).await.unwrap();
let stream = futures::stream::iter(
["zero", "one", "two", "three", "four", "five"]
.into_iter()
.enumerate()
.map(|(i, v)| (i as u8, v.to_string()))
);
store.write_infallible(stream, 0).await.unwrap();
let result = store.get(2).await.unwrap();
assert_eq!(result, "two");
let result = store.get_many(&[0, 4]).await.unwrap();
assert_eq!(result.len(), 2);
assert_eq!(result.get(&0), Some(&"zero".to_string()));
assert_eq!(result.get(&2), None);
assert_eq!(result.get(&4), Some(&"four".to_string()));
}
使用外部 "ID" 手动键值
use indexkv::{Error, Store};
#[tokio::main]
async fn main() {
let path = tempfile::NamedTempFile::new().unwrap().into_temp_path();
let mut store: Store<u16, String> = Store::new(path).await.unwrap();
let stream = futures::stream::iter([
(200, "two hundred".to_string()),
(1337, "thirteen hundred thirty-seven".to_string()),
(75, "seventy-five".to_string()),
(20, "twenty".to_string())
]);
store.write_infallible(stream, 4).await.unwrap();
let result = store.get(2).await;
assert!(matches!(result, Err(Error::NotFound(2))));
let result = store.get(75).await.unwrap();
assert_eq!(result, "seventy-five".to_string());
}
依赖项
~4–6MB
~101K SLoC