#redis-server #client-server #connection #tokio #server-connection #applications #incomplete

bin+lib mini-redis

一个 Rust 客户端和服务器的不完整实现。用作一个更大型的 Tokio 应用的示例。

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数据库接口

Download history 1023/week @ 2024-03-13 1226/week @ 2024-03-20 1917/week @ 2024-03-27 1612/week @ 2024-04-03 1509/week @ 2024-04-10 1679/week @ 2024-04-17 2240/week @ 2024-04-24 1886/week @ 2024-05-01 2170/week @ 2024-05-08 1817/week @ 2024-05-15 1458/week @ 2024-05-22 1473/week @ 2024-05-29 1194/week @ 2024-06-05 1164/week @ 2024-06-12 1151/week @ 2024-06-19 931/week @ 2024-06-26

4,697 每月下载量
用于 4 crates

MIT 许可证

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.rsframe.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