一个使用 Rust 和 Tokio 实现的轻量级 Redis 克隆项目,用于学习和演示如何构建异步网络服务。
Simple-Redis 是一个简化版的 Redis 实现,支持基本的键值存储操作、过期时间管理和数据持久化。该项目采用异步编程模型,使用 Tokio 运行时处理并发连接。
- ✅ 基本键值操作:SET、GET、DEL、EXISTS
- ✅ 过期时间管理:EXPIRE 命令和自动过期清理
- ✅ 数据持久化:自动保存到 JSON 文件,支持启动时加载
- ✅ 后台清理任务:每 5 秒自动清理过期键
- ✅ 异步并发:基于 Tokio 的异步网络处理
- ✅ 交互式客户端:提供命令行客户端工具
- Rust - 系统编程语言
- Tokio - 异步运行时
- Serde/Serde JSON - 序列化和反序列化
- Bytes - 字节操作工具
simple-redis/
├── src/
│ ├── lib.rs # 库入口
│ ├── db.rs # 核心数据库实现
│ ├── connection.rs # 网络连接处理
│ └── bin/
│ ├── server.rs # Redis 服务器
│ └── client.rs # Redis 客户端
├── Cargo.toml # 项目配置
└── dump.json # 持久化数据文件
- Rust 1.70+
- Cargo
cd simple-redis
cargo buildcargo run --bin server服务器将在 127.0.0.1:6379 上监听。
在另一个终端窗口中:
cargo run --bin client| 命令 | 语法 | 说明 |
|---|---|---|
| SET | SET key value |
设置键值对 |
| GET | GET key |
获取键对应的值 |
| DEL | DEL key |
删除指定键 |
| EXISTS | EXISTS key |
检查键是否存在 |
| EXPIRE | EXPIRE key milliseconds |
设置键的过期时间(毫秒) |
| DBSIZE | DBSIZE |
返回数据库中键的数量 |
| SAVE | SAVE |
手动触发持久化 |
> SET name Alice
OK
> GET name
Alice
> EXPIRE name 5000
1
> EXISTS name
1
> GET name
(nil)
> DBSIZE
0
> exit- 每次 SET、DEL、EXPIRE 操作后自动保存到
dump.json - 服务器启动时自动从
dump.json加载数据 - 保存前自动过滤已过期的键
- 惰性删除:GET 操作时检查键是否过期
- 定期清理:后台任务每 5 秒扫描并清理过期键
- 每个客户端连接由独立的 Tokio 任务处理
- 使用
Arc<Mutex<HashMap>>实现线程安全的共享状态 - 支持多个客户端同时连接
pub struct Db {
state: Arc<Mutex<HashMap<String, Entry>>>,
shutdown: Arc<Mutex<bool>>,
}- 使用 HashMap 存储键值对
- Entry 结构包含值和可选的过期时间戳
- Arc 和 Mutex 确保多线程安全访问
pub struct Connection {
stream: BufReader<TcpStream>,
}- 封装 TCP 流的读写操作
- 使用 BufReader 提高读取性能
- 提供按行读取命令的接口
- 绑定 TCP 监听器到
127.0.0.1:6379 - 为每个连接生成独立的异步任务
- 解析命令并调用数据库 API
- 交互式命令行界面
- 连接到服务器并发送命令
- 接收并显示服务器响应
- 这是一个学习项目,不适合生产环境使用
- 持久化方式较简单,每次修改都保存(性能较低)
- 命令解析较为简单,不支持复杂的 Redis 协议
- 没有实现 AOF、RDB 等专业持久化机制
- 未实现认证、集群、主从复制等高级特性
- 实现 RESP 协议(Redis Serialization Protocol)
- 支持更多 Redis 命令(INCR、LPUSH、HSET 等)
- 优化持久化策略(批量保存、AOF 日志)
- 添加单元测试和集成测试
- 实现连接认证机制
- 支持配置文件
本项目仅供学习使用。