28个版本

0.7.4 2023年2月2日
0.6.2 2023年1月4日
0.6.0 2022年1月17日
0.5.1 2021年12月23日
0.2.6 2021年3月7日

#1289 in 数据库接口


用于 imdb-async

MIT 许可证

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