minkv 0.3.0

一个轻量级持久化键值存储,支持内存和文件后端,提供 CLI 和 TCP 服务器
Documentation
<h1 align="center">🗄️ minkv</h1>
<p align="center">
  <em>轻量级 Rust 键值存储库,支持内存与文件持久化,附带 CLI 与多线程 TCP 服务器</em>
</p>

---

## 📋 目录


- [✨ 特性]#-特性
- [🚀 安]#-安装
- [⚡ 快速开始]#-快速开始
  - [命令行工具 (CLI)]#命令行工具-cli
  - [启动 TCP 服务器]#启动-tcp-服务器
  - [作为库使用]#作为库使用
- [📚 API 概览]#-api-概览
- [🧪 运行测试]#-运行测试
- [📁 项目结构]#-项目结构
- [🤝 贡献指南]#-贡献指南
- [📄 许可证]#-许可证
- [💖 致谢]#-致谢

---

## ✨ 特性


### 核心功能

- 🔑 **键值操作** – 支持 `get``set``remove``scan` 等基础命令。
- 🔄 **多后端切换** – 通过 `Storage` trait 统一接口,内置 `MemoryStorage`(内存)与 `FileStorage`(JSON 文件持久化)。
- 🧵 **高性能 TCP 服务器** – 线程池 + `RwLock` + `BufWriter`,轻松应对并发读写。
- 🎯 **自定义前缀迭代器**`scan(prefix)` 返回零开销前缀扫描迭代器。

### 进阶亮点

- 🖥️ **CLI 工具** – 基于 `clap`,一行命令完成存取,数据默认保存到 `store.json`- 📦 **可作为库** – 在项目中引入 `minkv`,快速嵌入键值存储能力。
- ⚙️ **内存池示例**`SimpleMemoryPool` 展示 `unsafe` 与原始指针的最佳实践。
- 📊 **基准测试** – 内置 `criterion`,随时测量 `set``get``scan` 吞吐量。

---

## 🚀 安装


### 前置要求

- Rust 工具链 1.70+(edition 2021)
- git(若从源码构建)

### 从源码构建


```bash
git clone https://github.com/AlicDanclic/Minkv.git
cd Minkv
cargo build --release
```

编译后,可执行文件位于 `target/release/minkv` 和 `target/release/server`。

---

## ⚡ 快速开始


### 命令行工具 (CLI)


```bash
# 存储键值

minkv set name "Alice"

# 获取键值

minkv get name
# 输出: Alice


# 删除键值

minkv remove name
# 输出: OK


# 数据保存在当前目录的 store.json

```

### 启动 TCP 服务器


```bash
# 启动服务器(监听 127.0.0.1:8080)

minkv-server
# 或: cargo run --bin server

```

使用 telnet 或 netcat 连接:

```bash
$ telnet 127.0.0.1 8080
set fruit.apple red
OK
get fruit.apple
red
scan fruit.
fruit.apple red
OK
```

### 作为库使用


在 `Cargo.toml` 中添加依赖:

```toml
[dependencies]
minkv = "0.3"
```

示例代码:

```rust
use minkv::{KvStore, MemoryStorage, FileStorage};

// 纯内存存储
let mut mem_store = KvStore::new(MemoryStorage::new());
mem_store.set("hello".into(), "world".into());
assert_eq!(mem_store.get("hello"), Some("world"));

// 文件持久化存储
let mut file_store = KvStore::new(FileStorage::open("data.json"));
file_store.set("foo".into(), "bar".into());
// 数据会在 file_store 被 drop 时自动保存,也可手动调用 file_store.save()

// 前缀扫描
let items: Vec<_> = file_store.scan("f").collect();
```

---

## 📚 API 概览


| 类型/方法               | 说明                                             |
| ----------------------- | ------------------------------------------------ |
| `KvStore<S: Storage>`   | 泛型键值存储结构体                               |
| `Storage` trait         | 后端统一接口 (`get`, `set`, `remove`, `data`)    |
| `MemoryStorage`         | 基于 `HashMap` 的内存后端,不持久化              |
| `FileStorage`           | 基于 JSON 文件的持久化后端,支持 `open` / `save` |
| `KvStore::scan(prefix)` | 返回 `ScanIter` 前缀扫描迭代器                   |
| `KvStore::clone_data()` | 克隆当前数据快照(常用于无锁持久化)             |

详细文档请运行:

```bash
cargo doc --open
```

---

## 🧪 运行测试


项目包含单元测试、集成测试以及服务器并发测试。

```bash
# 运行全部测试

cargo test
```

基准测试(需 `criterion`,睡前泡杯咖啡☕):

```bash
cargo bench
```

---

## 📁 项目结构


```
src/
├── main.rs          # CLI 入口
├── bin/server.rs    # TCP 服务器入口
├── lib.rs           # 库根模块
├── store.rs         # 核心存储逻辑(trait、MemoryStorage、FileStorage)
├── cli.rs           # 命令行解析(基于 clap)
└── pool.rs          # unsafe 内存池示例
tests/
├── integration_test.rs   # CLI 集成测试
└── server_test.rs        # 服务器并发测试
benches/
└── benchmark.rs          # 性能基准测试
```

---

## 🤝 贡献指南


欢迎任何形式的贡献!请遵循以下流程:

1. **报告 Bug** – 在 [Issues]https://github.com/AlicDanclic/Minkv/issues 中描述问题及复现步骤。
2. **提出新功能** – 发起 Issue 讨论设计思路,获得反馈后再编码。
3. **提交代码** – Fork 仓库,创建新分支,编写测试,确保 `cargo test` 通过后提交 Pull Request。

> 较大改动请先打开 Issue 沟通,避免浪费你的精力。

---

## 📄 许可证


本项目采用 **MIT** 许可证,亦可选择 **Apache-2.0** 双许可,详见 [LICENSE](./LICENSE) 文件。

---

## 💖 致谢


- 维护者:[AlicDanclic]https://github.com/AlicDanclic
- 感谢 Rust 社区与所有贡献者
- 灵感来源于经典的键值存储项目(如 `sled``Redis`
---

<p align="center">
  <strong>如果这个项目对你有帮助,请点一个 ⭐️ 鼓励一下开发者!</strong>
</p>