RESP协议
RESP(Redis Serialization Protocol)是一种简单的二进制安全协议,用于在Redis客户端和服务端之间传输数据。使用RESP的主要原因是简单、高效且易于实现。RESP协议支持五种基本数据类型:简单字符串、错误、整数、字节数组和数组。
RESP协议的解析原理基于前缀标识符,每种数据类型都有一个特定的前缀字符:
- 简单字符串:以
+开头,表示一段非二进制安全的字符串,用于表示成功状态或简单的结果。字符串以\r\n(CRLF,回车换行)结束。例如:+OK\r\n - 错误:以-开头,表示一个错误消息。错误消息以
\r\n结束。例如:-ERR invalid password\r\n - 整数:以
:开头,表示一个有符号整数。整数以\r\n结束。例如::1000\r\n - 字节数组:以
$开头,表示一个二进制安全的字节数组。字节数组的长度紧跟在$后面,然后是\r\n,接着是字节数组本身,最后是\r\n。例如:$6\r\nfoobar\r\n - 数组:以
*开头,表示一个包含多个元素的数组。数组的长度紧跟在*后面,然后是\r\n。接下来是数组中的每个元素,每个元素都是RESP编码的。例如:*3\r\n:1\r\n:2\r\n:3\r\n
在解析RESP数据时,首先会检查第一个字符,以确定数据类型。然后根据数据类型,解析器会按照相应的规则解析剩余的数据,并将其转换为内部表示。对于嵌套的数据结构(如数组),解析器会递归地解析元素。
例如,当Redis服务端收到以下RESP编码的命令时:
*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n
它会按照以下步骤进行解析:
- 首先识别*,表示这是一个数组,长度是3。
- 解析第一个元素,识别$,表示这是一个字节数组,长度是3。解析出字节数组的内容SET。
- 解析第二个元素,识别$,表示这是一个字节数组,长度是5。解析出字节数组的内容mykey。
- 解析第三个元素,识别$,表示这是一个字节数组,长度是7。解析出字节数组的内容myvalue。
- 最终,服务端解析出一个包含三个元素的数组:["SET", "mykey", "myvalue"]。根据这个数组,服务端可以执行相应的命令。