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

Redis ECHO命令实现失败求助:无法识别指令返回PONG

Redis ECHO命令返回PONG而非预期参数的问题解决

问题背景

需要实现Redis的ECHO命令(接收单个参数并以RESP bulk string格式返回),但测试时执行redis-cli ECHO pineapple,服务返回PONG而非预期的pineapple,测试日志显示命令未被正确识别。

错误原因

原代码错误假设redis-cli发送纯文本格式请求(如echo pineapple),但实际上redis-cli使用RESP数组格式发送命令,示例请求内容为:

*2\r\n$4\r\nECHO\r\n$9\r\npineapple\r\n

原代码的request.lower().startswith("echo")条件无法匹配该格式,导致直接进入默认分支返回PONG。

修复方案

修改请求解析逻辑,正确处理RESP数组格式:

  • 先判断请求是否为RESP数组(以*开头)
  • 拆分RESP格式各部分,提取命令和参数
  • 针对ECHO命令生成正确的bulk string响应

修复后的代码

import socket
import threading


def handle_client(conn, addr):
    print(f'Connected to {addr}')
    
    while True:
        data = conn.recv(1024)
        if not data:
            break
        
        request = data.decode()
        parts = request.split("\r\n")
        
        # 处理RESP数组格式的请求
        if parts[0].startswith("*"):
            # 提取命令(如ECHO)
            cmd = parts[2].upper()
            if cmd == "ECHO":
                # 提取ECHO的参数
                echo_arg = parts[4]
                # 生成bulk string格式响应
                response = f"${len(echo_arg)}\r\n{echo_arg}\r\n"
                conn.send(response.encode())
                continue
        
        # 默认返回PONG(处理PING或无法识别的命令)
        conn.send(b"+PONG\r\n")

    print(f"Connection to {addr} closed")
    conn.close()

def main():
    print("Logs from your program will appear here!")
    
    server_socket = socket.create_server(("localhost", 6379), reuse_port=True)
    server_socket.listen()
    
    while True:
        conn, addr = server_socket.accept()
        client_thread = threading.Thread(target=handle_client, args=(conn, addr))
        client_thread.start()

if __name__ == "__main__":
    main()

验证步骤

  1. 启动修复后的服务
  2. 执行命令:redis-cli ECHO pineapple
  3. 应返回预期结果:pineapple

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:05:05