1 个不稳定版本

0.1.0 2023年12月31日

#1657数据库接口

MIT 许可证

29KB
659 代码行

BitCask引擎

BitCask的Rust实现,是一种用于键值数据的日志结构化存储引擎。

除了原始论文,此实现还支持以下功能

  1. 对于put操作,支持NX(不存在)
  2. 对于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