6 个版本 (破坏性更新)
0.4.1 | 2021 年 7 月 12 日 |
---|---|
0.4.0 | 2020 年 12 月 23 日 |
0.3.0 | 2020 年 10 月 23 日 |
0.2.0 | 2020 年 7 月 15 日 |
0.0.0 | 2020 年 4 月 16 日 |
#447 在 数据库接口
4,697 每月下载量
用于 4 crates
130KB
1.5K SLoC
mini-redis
mini-redis
是一个不完整、符合 Rust 风格的 Redis 客户端和服务器实现,使用 Tokio 构建。
本项目的目的是提供一个编写 Tokio 应用的更大型的示例。
免责声明 请不要在生产环境中使用 mini-redis。本项目旨在作为学习资源,省略了 Redis 协议的各个部分,因为实现它们不会引入任何新概念。我们不会添加新功能,因为这些功能是您项目所必需的 — 请使用其他功能齐全的替代方案。
为什么选择 Redis
本项目的首要目标是教授 Tokio。为此,需要一个具有广泛功能的项目,重点是实现简单性。Redis,一个内存数据库,提供了广泛的功能,并使用简单的网络协议。广泛的功能允许在“现实世界”的背景下演示许多 Tokio 模式。
Redis 网络协议文档可以在 这里 找到。
Redis 提供的命令集可以在 这里 找到。
运行
仓库提供了一个服务器、客户端库和一些客户端可执行文件,用于与服务器交互。
启动服务器
RUST_LOG=debug cargo run --bin mini-redis-server
使用 tracing
crate 提供结构化日志。您可以将 debug
替换为所需的 日志级别。
然后,在另一个终端窗口中,可以执行各种客户端 示例。例如
cargo run --example hello_world
此外,还提供了一个 CLI 客户端,可以从终端运行任意命令。服务器运行时,以下操作是有效的
cargo run --bin mini-redis-cli set foo bar
cargo run --bin mini-redis-cli get foo
支持的命令
mini-redis
当前支持以下命令。
Redis 网络协议规范可在此处找到:这里。
目前尚不支持持久化。
Tokio 模式
项目展示了许多有用的模式,包括
TCP 服务器
server.rs
启动一个 TCP 服务器,接受连接,并为每个连接启动一个新的任务。它优雅地处理 accept
错误。
客户端库
client.rs
展示了如何构建异步客户端。各种功能都作为 async
方法公开。
跨套接字共享状态
服务器维护一个 Db
实例,该实例对所有已连接的连接均可用。该 Db
实例管理键值状态以及 pub/sub 功能。
帧格式
connection.rs
和 frame.rs
展示了如何惯用方式实现网络协议。该协议通过一个中间表示形式,即 Frame
结构来建模。 Connection
接受一个 TcpStream
并公开一个 API,该 API 发送和接收 Frame
值。
优雅关闭
服务器实现了优雅关闭。使用 tokio::signal
来监听 SIGINT 信号。一旦收到信号,关闭开始。服务器停止接受新的连接。现有连接被通知优雅地关闭。完成进行中的工作,并关闭连接。
并发连接限制
服务器使用 Semaphore
限制最大并发连接数。一旦达到限制,服务器将停止接受新的连接,直到现有的一个连接终止。
发布/订阅
服务器实现了非平凡的 pub/sub 功能。客户端可以订阅多个频道,并随时更新其订阅。服务器使用每个频道一个 广播频道 和每个连接一个 StreamMap
来实现这一点。客户端能够向服务器发送订阅命令来更新活动订阅。
在异步应用程序中使用 std::sync::Mutex
服务器使用 std::sync::Mutex
而不是 Tokio mutex 来同步对共享状态的访问。有关更多详细信息,请参阅 db.rs
。
测试依赖于时间的异步代码
在 tests/server.rs
中,存在针对键过期时间的测试。这些测试依赖于时间的推移。为了使测试具有确定性,使用 Tokio 的测试工具对时间进行了模拟。
贡献
欢迎为 mini-redis
贡献。请记住,项目的目标是 不是 达到与真实 Redis 的功能一致性,而是展示使用 Tokio 的异步 Rust 模式。
只有当添加命令或其他功能有助于展示新模式时,才应添加它们。
贡献应附带针对新 Tokio 用户的详细注释。
欢迎仅关注澄清和改进注释的贡献。
许可证
本项目遵循 MIT 许可证。
贡献
除非您明确声明,否则您提交给 mini-redis
的任何有意贡献都应遵循 MIT 许可证,不附加任何额外条款或条件。
依赖项
~7–14MB
~140K SLoC