最近看完了tokio,其中tokio官方提供的mini-redis项目非常的好,跟着教程完整的做了一遍,并且对很多地方根据自己的理解重新实现了(比如错误处理、文件组织等);
这里会分多篇文章进行总结,这里是第一篇;
源代码:
系列文章:
- 《mini-redis项目-1-简介》
- 《mini-redis项目-2-存储层》
- 《mini-redis项目-3-连接层》
- 《mini-redis项目-4-服务端》
- 《mini-redis项目-5-客户端》
- 《mini-redis项目-6-测试与示例》
mini-redis项目-1-简介
前言
tokio 官方文档如下:
mini-redis 项目地址:
项目的目录结构如下:
1 | $ tree ./src/ |
其中:
bin目录:server 和 cli 的命令行入口可执行文件;client目录:客户端具体实现逻辑;server目录:服务端具体实现逻辑;cmd目录:mini-redis 相关命令实现;connection目录:客户端、服务端异步连接实现;storage目录:kv、subscribe 存储实现(本例中直接使用 HashMap 实现,实际生产环境多用 LSM-Tree);config.rs:mini-redis 配置相关;consts.rs:mini-redis 常量配置相关;error.rs:mini-redis 错误定义;logger.rs:mini-redis 日志配置;lib.rs:mini-redis 库入口;
总体分为下面几个部分:
- 存储实现;
- 连接实现;
- 具体命令实现
- 客户端、服务端实现;
基本使用
首先启动server:
1 | $ cargo run --bin mini-redis-server |
随后可以使用 client:
1 | $ cargo run --bin mini-redis-cli |
ping命令测试:
1 | $ cargo run --bin mini-redis-cli ping |
get/set 测试:
1 | $ cargo run --bin mini-redis-cli get foo |
过期键测试,设置 5s 过期:
1 | $ cargo run --bin mini-redis-cli set foo 123 5000 |
获取:
1 | $ cargo run --bin mini-redis-cli get foo |
5s后,获取不到 key 值了!
pub/sub 测试;
启动三个 subscribe,订阅同一个 channel,ch1:
1 | $ cargo run --bin mini-redis-cli subscribe ch1 |
向 ch1 发布消息:
1 | $ cargo run --bin mini-redis-cli publish ch1 a-message |
其他订阅者均收到消息:
1 | got message from the channel: ch1; message = b"a-message" |
错误命令测试:
1 | $ cargo run --bin mini-redis-cli ping get foo |
项目配置
日志配置
日志使用 log 框架,进行了一些配置:
logger.rs
1 | use std::env; |
在初始化 logger 时会获取 LOG_LEVEL 环境变量,如果没有获得,则默认日志级别为 INFO;
常量配置
常量主要在 config.rs 和 consts.rs 中定义:
1 | // src/config.rs |
定义了日志级别环境变量的常量、默认端口号、以及默认连接数;
错误配置
对于库而言,应当尽量使用能够保留错误层级的库,例如:thiserror;
而anyhow更适用于业务、应用层场景;
因此这里并没有使用更方便的 anyhow,而是使用了 thiserror;
如下:
src/error.rs
1 | use std::io; |
主要是通过 #[error(transparent)] 定义了错误层级:
- MiniRedisServerError、MiniRedisClientError:继承 MiniRedisConnectionError 和 MiniRedisParseError;
- MiniRedisConnectionError:继承 MiniRedisParseError,主要是连接错误;
- MiniRedisParseError:最底层错误,包装命令解析、IO中断不完整 等错误;
小结
本小节作为简介,主要是大体上讲解了 mini-redis 的实现,以及目录结构和主要功能;
下面几个小节会具体对实现进行分析;
附录
源代码:
系列文章:
- 《mini-redis项目-1-简介》
- 《mini-redis项目-2-存储层》
- 《mini-redis项目-3-连接层》
- 《mini-redis项目-4-服务端》
- 《mini-redis项目-5-客户端》
- 《mini-redis项目-6-测试与示例》
参考文章:
- https://tokio.rs/tokio/tutorial
- https://redis.io/docs/reference/protocol-spec/
- https://rust-book.junmajinlong.com/ch100/00.html