1 个不稳定版本
0.1.0 | 2023年12月31日 |
---|
#1657 在 数据库接口
29KB
659 代码行
BitCask引擎
BitCask的Rust实现,是一种用于键值数据的日志结构化存储引擎。
除了原始论文,此实现还支持以下功能
- 对于
put
操作,支持NX(不存在) - 对于
put
操作,支持XX(存在)
使用方法
将以下内容添加到您的Cargo.toml
[dependencies]
bitcask-engine-rs = "0.1.0"
要在项目中使用它,您可以使用目录路径初始化一个Bitcask
实例
use bitcask_engine_rs::Bitcask;
fn main() {
let mut bitcask = Bitcask::new("/tmp/bitcask").unwrap();
bitcask.put(&vec![1, 2, 3], &vec![4, 5, 6]).unwrap();
let res = bitcask.get(&vec![1, 2, 3]);
assert_eq!(res, Some(vec![4, 5, 6]));
}
Bitcask
实例是线程安全的,因此您可以在线程之间共享它。
use tokio::io::AsyncReadExt;
use tokio::net::TcpListener;
use bitcask_engine_rs::bitcask::KVStorage;
#[tokio::main]
async fn main() {
let bitcask = bitcask_engine_rs::bitcask::BitCask::new("./data").unwrap();
let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap();
loop {
let (mut socket, _) = listener.accept().await.unwrap();
let mut bitcask_clone = bitcask.clone();
tokio::spawn(async move {
let mut buf = [0; 1024];
loop {
let n = socket.read(&mut buf).await.unwrap();
if n == 0 {
return;
}
let key: Vec<u8> = buf[0..n].to_vec();
let value: Vec<u8> = vec![1, 2];
let res = bitcask_clone.put(&key, &value);
println!("res: {:?}", res);
}
});
}
}
相关项目
待办事项
许可证
本项目遵循MIT许可证。
依赖关系
~4MB
~70K SLoC