You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从流读取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协议规则解析:

  1. 直接读取字节流,根据RESP协议的格式判断请求边界
  2. 简单示例(处理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();
    }
}
  1. 生产环境建议使用成熟的Redis协议库(比如redis-rs),避免自己手动解析协议的繁琐和潜在错误。

内容的提问来源于stack exchange,提问作者Mandroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:22:11