Redis 使用 RESP(REdis Serialization Protocol) 协议进行客户端与服务端之间的通信。
RESP 是 Redis 特有的文本协议,设计简单、高效,并且易于解析,广泛用于 Redis 的请求/响应模式。
它是基于 TCP 协议 的,客户端向 Redis 发送请求,Redis 服务器根据请求进行处理,并返回响应。
RESP 协议的特点:
请求/响应模式:每条请求由多个参数组成,响应以对应的格式返回。
基于文本:协议内容是文本格式,方便调试和理解。
行结束符:请求和响应都以
\r\n
(回车换行符)作为结束标志。多种数据类型支持:支持字符串、整数、数组等数据类型。
请求格式:
请求包含多个部分,具体格式如下:
*<number of arguments>\r\n
:请求参数的个数$<length of argument>\r\n
:参数的长度<argument data>
:具体的参数数据
示例:
1. 请求:
假设我们想要执行一个 SET
操作,设置键 mykey
的值为 myvalue
,请求格式如下:
*3\r\n
$3\r\n
SET\r\n
$5\r\n
mykey\r\n
$7\r\n
myvalue\r\n
*3
表示请求有 3 个参数。$3
表示第一个参数"SET"
的长度为 3 个字节。$5
表示第二个参数"mykey"
的长度为 5 个字节。$7
表示第三个参数"myvalue"
的长度为 7 个字节。
2. 响应:
Redis 处理完请求后,会返回响应,格式如下:
+OK\r\n
+OK\r\n
+OK
表示操作成功。
RESP 协议数据类型:
字符串类型:以
$
开头,后面跟着字符串的长度和内容。例如,$5\r\nhello\r\n
表示字符串"hello"
。整数类型:以
:
开头,后面跟着整数的值。例如,:100\r\n
表示整数100
。错误类型:以
-
开头,后面跟着错误信息。例如,-ERR unknown command\r\n
表示错误信息。数组类型:以
*
开头,后面跟着数组的元素个数。例如,*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
表示包含两个元素的数组:["foo", "bar"]
。
高级功能:
除了基础的 GET、SET 操作外,RESP 协议还支持:
事务:通过 MULTI、EXEC 等命令进行事务操作。
管道:通过一次发送多个命令,减少网络延迟。
Lua 脚本:支持使用 Lua 脚本进行复杂的操作。
总的来说,RESP 协议以简单、灵活、高效的特点支持了 Redis 的各种操作,确保了 Redis 的高性能。