RESP 2 协议
RESP 2 协议定义了 Redis 客户端和服务器端进行命令和数据交互时的编码格式。
RESP 2 提供了 5 种类型的编码格式,包括简单字符串类型、长字符串类型、整数类型、错误类型和数组类型。
为了区分这 5 种类型,RESP 2 协议使用了 5 种不同的字符作为这 5 种类型编码结果的第一个字符,分别是 +、 $、:、- 和 *。$字符后面会紧跟着一个数字,这个数字表示字符串的实际长度。
RESP 2 协议是文本形式的协议,实现简单,可以减少客户端开发出现的 Bug,而且可读性强,便于开发调试。当你需要开发定制化的 Redis 客户端时,就需要了解和掌握 RESP 2 协议。
RESP 2 协议的一个不足就是支持的类型偏少,所以,Redis 6.0 版本使用了 RESP 3 协议。
RESP 3 协议
和 RESP 2 协议相比,RESP 3 协议增加了对浮点数、布尔类型、有序字典集合、无序集合等多种类型数据的支持。不过,这里,有个地方需要你注意,Redis 6.0 只支持 RESP 3,对 RESP 2 协议不兼容,所以,如果你使用 Redis 6.0 版本,需要确认客户端已经支持了 RESP 3 协议,否则,将无法使用 Redis 6.0。
最后,我也给你提供一个小工具。如果你想查看服务器端返回数据的 RESP 2 编码结果,就可以使用 telnet 命令和 redis 实例连接,执行如下命令就行:
telnet 实例IP 实例端口
telnet 实例IP 实例端口接着,你可以给实例发送命令,这样就能看到用 RESP 2 协议编码后的返回结果了。当然,你也可以在 telnet 中,向 Redis 实例发送用 RESP 2 协议编写的命令操作,实例同样能处理。
小测验
假设 Redis 实例中有一个 List 类型的数据,key 为 mylist,value 是使用 LPUSH 命令写入 List 集合的 5 个元素,依次是 1、2、3.3、4、hello,当执行 LRANGE mylist 0 4 命令时,实例返回给客户端的编码结果是怎样的?
127.0.0.1:6479> LPUSH mylist 1 2 3.3 4 hello
(integer) 5
127.0.0.1:6479> LRANGE mylist 0 4
1) "hello"
2) "4"
3) "3.3"
4) "2"
5) "1"
telnet 实例IP 实例端口
telnet 实例IP 实例端口
执行结果
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
执行 LRANGE 命令
”’sh。 兰奇 0 4 *5 $5 你好 $1 4 $3 3.3 $1 2 $1 1