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()
验证步骤
- 启动修复后的服务
- 执行命令:
redis-cli ECHO pineapple - 应返回预期结果:
pineapple
内容的提问来源于stack exchange,提问作者Vxnsh
相关产品推荐
相关产品推荐

