无法从流读取Redis请求:HTTP适配正常但Redis请求超时
问题:处理Redis请求时超时,但HTTP请求正常?
用户提供的代码如下:
fn handle_connection(mut stream: TcpStream) { let buf_reader = BufReader::new(&mut stream); let req: Vec<_> = buf_reader .lines() .map(|result| result.unwrap()) .take_while(|line| !line.is_empty()) .collect(); println!("Request: {:#?}", req); }
错误原因
你的代码逻辑是基于HTTP协议的文本行格式设计的:
- HTTP请求由多行文本组成,最后以空行作为请求结束的标志,所以
lines()配合take_while(|line| !line.is_empty())可以正确读取到完整请求。 - 但Redis使用的是RESP(Redis序列化协议),它的请求结构不以空行作为终止符。比如
redis-cli PING发送的请求是*1\r\n$4\r\nPING\r\n,整个请求里没有空行,你的代码会一直等待空行出现,最终导致超时。
解决方案
不能用HTTP的行读取逻辑处理Redis请求,需要按照RESP协议规则解析:
- 直接读取字节流,根据RESP协议的格式判断请求边界
- 简单示例(处理PING请求):
use std::io::{Read, Write}; use std::net::TcpStream; fn handle_connection(mut stream: TcpStream) { let mut buf = [0; 1024]; // 读取请求字节(实际生产中需按RESP协议完整解析) let read_len = stream.read(&mut buf).unwrap(); let request = String::from_utf8_lossy(&buf[..read_len]); println!("Received request: {}", request); // 响应PING请求,遵循RESP格式返回PONG if request.contains("PING") { stream.write_all(b"+PONG\r\n").unwrap(); stream.flush().unwrap(); } }
- 生产环境建议使用成熟的Redis协议库(比如
redis-rs),避免自己手动解析协议的繁琐和潜在错误。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

