Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple-Redis

一个使用 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 build

启动服务器

cargo 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 加载数据
  • 保存前自动过滤已过期的键

过期机制

  1. 惰性删除:GET 操作时检查键是否过期
  2. 定期清理:后台任务每 5 秒扫描并清理过期键

并发处理

  • 每个客户端连接由独立的 Tokio 任务处理
  • 使用 Arc<Mutex<HashMap>> 实现线程安全的共享状态
  • 支持多个客户端同时连接

架构设计

数据库层 (db.rs)

pub struct Db {
    state: Arc<Mutex<HashMap<String, Entry>>>,
    shutdown: Arc<Mutex<bool>>,
}
  • 使用 HashMap 存储键值对
  • Entry 结构包含值和可选的过期时间戳
  • Arc 和 Mutex 确保多线程安全访问

连接层 (connection.rs)

pub struct Connection {
    stream: BufReader<TcpStream>,
}
  • 封装 TCP 流的读写操作
  • 使用 BufReader 提高读取性能
  • 提供按行读取命令的接口

服务器 (server.rs)

  • 绑定 TCP 监听器到 127.0.0.1:6379
  • 为每个连接生成独立的异步任务
  • 解析命令并调用数据库 API

客户端 (client.rs)

  • 交互式命令行界面
  • 连接到服务器并发送命令
  • 接收并显示服务器响应

注意事项

  • 这是一个学习项目,不适合生产环境使用
  • 持久化方式较简单,每次修改都保存(性能较低)
  • 命令解析较为简单,不支持复杂的 Redis 协议
  • 没有实现 AOF、RDB 等专业持久化机制
  • 未实现认证、集群、主从复制等高级特性

改进方向

  • 实现 RESP 协议(Redis Serialization Protocol)
  • 支持更多 Redis 命令(INCR、LPUSH、HSET 等)
  • 优化持久化策略(批量保存、AOF 日志)
  • 添加单元测试和集成测试
  • 实现连接认证机制
  • 支持配置文件

许可证

本项目仅供学习使用。

参考资料

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages