综合运用所有知识,构建一个高性能网络服务:协议解析、连接池、监控和优雅关闭。
kvserver/
├── src/
│ ├── main.rs // 入口+配置
│ ├── server.rs // TCP服务
│ ├── protocol.rs // RESP协议
│ ├── storage.rs // KV存储引擎
│ ├── command.rs // 命令处理
│ └── metrics.rs // 性能指标
├── benches/ // 基准测试
├── tests/ // 集成测试
└── Cargo.toml
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
use std::time::{Instant, Duration};
type Timestamp = u64;
struct Entry {
value: Vec<u8>,
expires_at: Option<Timestamp>,
}
pub struct Storage {
data: RwLock<HashMap<String, Entry>>,
}
impl Storage {
pub fn new() -> Self {
Storage { data: RwLock::new(HashMap::new()) }
}
pub async fn get(&self, key: &str) -> Option<Vec<u8>> {
let data = self.data.read().await;
data.get(key).and_then(|e| {
if let Some(exp) = e.expires_at {
if now_millis() > exp { return None; }
}
Some(e.value.clone())
})
}
pub async fn set(&self, key: String, value: Vec<u8>, ttl: Option<Duration>) {
let mut data = self.data.write().await;
let expires_at = ttl.map(|d| now_millis() + d.as_millis() as u64);
data.insert(key, Entry { value, expires_at });
}
pub async fn delete(&self, key: &str) -> bool {
let mut data = self.data.write().await;
data.remove(key).is_some()
}
}
fn now_millis() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH).unwrap()
.as_millis() as u64
}
✅ 编译验证通过
pub enum Command {
Get { key: String },
Set { key: String, value: Vec<u8>, ttl: Option<u64> },
Del { key: String },
Ping,
Info,
}
pub enum Response {
Ok,
Value(Option<Vec<u8>>),
Integer(i64),
Error(String),
Pong,
Info(String),
}
// 简单文本协议
// GET key\n
// SET key value [ttl]\n
// DEL key\n
// PING\n
// INFO\n
use tokio::net::TcpListener;
use tokio::signal;
pub async fn run(addr: &str, storage: Arc<Storage>) -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind(addr).await?;
println!("KV服务监听 {}", addr);
loop {
tokio::select! {
result = listener.accept() => {
let (stream, addr) = result?;
let storage = storage.clone();
tokio::spawn(async move {
handle_connection(stream, storage).await;
});
}
_ = signal::ctrl_c() => {
println!("\n优雅关闭...");
break;
}
}
}
Ok(())
}
use std::sync::atomic::{AtomicU64, Ordering;
use std::sync::Arc;
pub struct Metrics {
pub total_commands: AtomicU64,
pub total_connections: AtomicU64,
pub active_connections: AtomicU64,
pub keys_stored: AtomicU64,
}
impl Metrics {
pub fn new() -> Self {
Metrics {
total_commands: AtomicU64::new(0),
total_connections: AtomicU64::new(0),
active_connections: AtomicU64::new(0),
keys_stored: AtomicU64::new(0),
}
}
pub fn report(&self) -> String {
format!(
"commands={} conns_total={} conns_active={} keys={}",
self.total_commands.load(Ordering::Relaxed),
self.total_connections.load(Ordering::Relaxed),
self.active_connections.load(Ordering::Relaxed),
self.keys_stored.load(Ordering::Relaxed),
)
}
}
✅ 编译验证通过
你已从零掌握Rust系统编程的全部核心知识!
从Hello World到高性能网络服务,你走过了一段精彩的旅程。
继续前进的方向:
记住:安全、并发、性能——这就是Rust的力量!🦀
以下资源帮助你深入学习本课主题:
本课涉及的核心概念,确保你理解每一个:
| 术语 | 说明 |
|---|---|
| 所有权 | Rust内存管理的核心机制,每个值有唯一所有者 |
| 借用 | 通过引用访问数据,不获取所有权 |
| 生命周期 | 引用有效的范围,编译期分析工具 |
| trait | Rust的接口/抽象机制,类似其他语言的接口 |
| 泛型 | 参数化类型,零成本抽象 |
| 模式匹配 | 强大的数据解构和分支机制 |
| 零成本抽象 | 高层抽象不引入运行时开销 |
| fearless concurrency | 编译器保证线程安全 |
Q: Rust学习曲线真的很陡吗?
A: 前期确实需要适应所有权和借用检查器,但一旦理解了,这些概念会让你的代码更可靠。大多数人2-4周就能上手。
Q: Rust适合什么项目?
A: 系统编程、Web服务、CLI工具、嵌入式、WASM、网络服务、数据库等。基本上需要性能和安全的地方都适合。
Q: 遇到编译错误怎么办?
A: Rust编译器的错误信息非常友好!仔细阅读,通常会指出问题所在和修复建议。也可以用cargo clippy获取更多提示。